2014-11-05 51 views
2

我有這個函數返回所有proccess無法寫入multilined結果的文本文件vb.net

Declare Auto Function GetExtendedTcpTable Lib "iphlpapi.dll" (ByVal pTCPTable As IntPtr, ByRef OutLen As Integer, ByVal Sort As Boolean, ByVal IpVersion As Integer, ByVal dwClass As Integer, ByVal Reserved As Integer) As Integer 
Const TCP_TABLE_OWNER_PID_ALL As Integer = 5 
<StructLayout(LayoutKind.Sequential)> _ 
Public Structure MIB_TCPTABLE_OWNER_PID 
    Public NumberOfEntries As Integer 'number of rows 
    Public Table As IntPtr 'array of tables 
End Structure 
<StructLayout(LayoutKind.Sequential)> _ 
Public Structure MIB_TCPROW_OWNER_PID 
    Public state As Integer 'state of the connection 
    Public localAddress As UInteger 
    Public LocalPort As Integer 
    Public RemoteAddress As UInteger 
    Public remotePort As Integer 
    Public PID As Integer 'Process ID 
End Structure 
Structure TcpConnection 
    Public State As TcpState 
    Public localAddress As String 
    Public LocalPort As Integer 
    Public RemoteAddress As String 
    Public remotePort As Integer 
    Public Proc As String 
End Structure 
Function GetAllTCPConnections() As MIB_TCPROW_OWNER_PID() 
    GetAllTCPConnections = Nothing 
    Dim cb As Integer 
    GetExtendedTcpTable(Nothing, cb, False, 2, TCP_TABLE_OWNER_PID_ALL, 0) 
    Dim tcptable As IntPtr = Marshal.AllocHGlobal(cb) 
    If GetExtendedTcpTable(tcptable, cb, False, 2, TCP_TABLE_OWNER_PID_ALL, 0) = 0 Then 
     Dim tab As MIB_TCPTABLE_OWNER_PID = Marshal.PtrToStructure(tcptable, GetType(MIB_TCPTABLE_OWNER_PID)) 
     Dim Mibs(tab.NumberOfEntries - 1) As MIB_TCPROW_OWNER_PID 
     Dim row As IntPtr 
     For i As Integer = 0 To tab.NumberOfEntries - 1 
      row = New IntPtr(tcptable.ToInt32 + Marshal.SizeOf(tab.NumberOfEntries) + Marshal.SizeOf(GetType(MIB_TCPROW_OWNER_PID)) * i) 
      Mibs(i) = Marshal.PtrToStructure(row, GetType(MIB_TCPROW_OWNER_PID)) 
     Next 
     GetAllTCPConnections = Mibs 
    End If 
    Marshal.FreeHGlobal(tcptable) 
End Function 
Function MIB_ROW_To_TCP(ByVal row As MIB_TCPROW_OWNER_PID) As TcpConnection 
    Dim tcp As New TcpConnection 
    tcp.State = DirectCast(row.state, TcpState) 'a State enum is better than an int 
    Dim ipad As New IPAddress(row.localAddress) 
    tcp.localAddress = ipad.ToString 
    tcp.LocalPort = row.LocalPort/256 + (row.LocalPort Mod 256) * 256 
    ipad = New IPAddress(row.RemoteAddress) 
    tcp.RemoteAddress = ipad.ToString 
    tcp.remotePort = row.remotePort/256 + (row.remotePort Mod 256) * 256 
    Dim p As Process = Process.GetProcessById(row.PID) 
    tcp.Proc = p.ProcessName 
    p.Dispose() 
    Return tcp 
End Function 

我wan't存儲在文本某些工藝的只有走出去連接的所有TCP連接文件所以我用

Sub main() 
    For Each Row In GetAllTCPConnections() 
     Dim Tcp As TcpConnection = MIB_ROW_To_TCP(Row) 
     Dim RemoteAddress As String = Tcp.RemoteAddress.ToString 
     Dim process As String = Tcp.Proc 
     If (process = "chrome" Or process = "Viber" Or process = "ddns") And (RemoteAddress <> "127.0.0.1") And (RemoteAddress <> "0.0.0.0") Then 
      Dim myFile As String = "C:\TCP.txt" 
      Using sw As StreamWriter = New StreamWriter(myFile) 
       Dim line As String = Tcp.RemoteAddress & "|" & Tcp.localAddress & "|" & Tcp.LocalPort & "|" & Tcp.Proc 
        sw.WriteLine(line) 
        MsgBox(line) 
      End Using 
     End If 
    Next 

End Sub 

MSGBOX工作正常顯示每個進程和走出去,通過它建立的連接,但是當我打開

TCP.txt

file我只找到一行。 那麼如何將整個結果(每個進程都帶出去的連接)寫入文本文件?

+0

使用'Environment.NewLine'? – Baby 2014-11-06 00:52:51

+0

你在每個循環中打開一個新的Stream;你不會告訴SW追加,所以它可能會覆蓋以前的項目,只剩下最後一個。 MsgBox只顯示循環中的哪個項目處於活動狀態。 – Plutonix 2014-11-06 01:12:16

回答

0

您需要將追加設置爲文本文件。

你需要改變:
使用SW作爲的StreamWriter =新的StreamWriter(MYFILE)

使用SW作爲的StreamWriter =新的StreamWriter(MYFILE,真)

通過設置您設置的真實追加到文件爲真

+0

,爲我工作,謝謝 – 2014-11-06 20:37:47