none
VB讀取LOG檔案要如何一筆一筆讀取,而不是整批載入 RRS feed

  • 問題

  • 小弟用VB寫一個可以去讀log檔案的軟體

    路徑是C:\Program Files\Network Recording Software Premium

    他底下有許多log檔案,其中4

    User.log      System.log     Sensor.log      Motion.log

    是我需要讀取的檔案

     

     

    System.log的內容如下

     

    04/26/10 15:34:40
    04/26/10 15:34:40  - Network Recording Software
    啟動
    04/26/10 15:34:50  -
    記憶體超載 - 錄影暫停
    04/26/10 15:36:47  - Network Recording Software
    關閉系統
    04/26/10 15:39:56  - Network Recording Software
    啟動
    04/26/10 15:56:53  -
    頻道 01 - 連線

     

    我先寫一段偵測異動的程式可以偵測到它有變動時

    去讀取那個變動的檔案

     

    到此動作都沒問題,但是底下問題我一直卡住,實在是想不到辦法了,

    (黃色Mark起來的區段是我的問題所在)

     

    該如何一筆一筆的讀檔案)><

    然後每次異動讀檔時,要讀上次結束的下一筆

     

     

    我的VB原始碼如下

    2010年7月26日 上午 09:22

解答

  • FileStream.Read方法有一個多載是可以指定從特定位置讀取特定長度.

    照這個用法來說, 你可以在每次讀完時, 記錄你所讀最後一次的位置, 下一次就接著讀.

    以下連結有一個類似的例子.

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/23083d65-0844-43f3-883e-606225e87333


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年7月26日 下午 02:28
    版主

所有回覆

  • Imports System.IO

    Imports System.IO.DirectoryInfo

    Imports System.Text

    Imports System.Threading

    Imports System.Configuration

    Imports System.Data.SqlClient

     

    Public Class Form1

        Inherits System.Windows.Forms.Form

        Dim WithEvents FSWatcher As New FileSystemWatcher()

        Dim DataSource As String

         Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            OpenFileDialog1.Filter = "Log|*.log|All|*.*"

            DataSource = "Data Source=.\SQLEXPRESS;Initial Catalog=Nantai;Integrated Security=SSPI"

            觸動()

        End Sub

        Private Sub 觸動()

            Dim strPathWatch As String

            Dim strFileWatch As String

            strPathWatch = "C:\Program Files\Network Recording Software Premium"

            strFileWatch = "*.log"

            FSWatcher.Path = strPathWatch

            FSWatcher.Filter = strFileWatch

            FSWatcher.IncludeSubdirectories = True

            FSWatcher.NotifyFilter = NotifyFilters.LastWrite Or NotifyFilters.FileName

            FSWatcher.EnableRaisingEvents = True

            ' txtWatch.Text += vbCrLf + ">>監控中......"

        End Sub

        Private Sub FSWatcher_Created(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FSWatcher.Created

            WatchMessage(e.FullPath, "異動型態:建立檔案(" + e.FullPath.ToString + ")觸發事件:Created")

        End Sub

        Private Sub FSWatcher_Deleted(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FSWatcher.Deleted

            WatchMessage(e.FullPath, "異動型態:刪除檔案(" + e.FullPath.ToString + ")觸發事件:Deleted")

        End Sub

        Private Sub FSWatcher_Error(ByVal sender As Object, ByVal e As System.IO.ErrorEventArgs) Handles FSWatcher.Error

            WatchMessage("", "錯誤訊息:" + e.GetException.Message)

        End Sub

        Private Sub FSWatcher_Rename(ByVal sender As Object, ByVal e As System.IO.RenamedEventArgs) Handles FSWatcher.Renamed

            WatchMessage(e.FullPath, "異動型態:從新命名檔案(" + e.ChangeType.ToString + ")觸發事件:Renamed")

        End Sub

        Private Sub FSWatcher_Changed(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FSWatcher.Changed

            WatchMessage(e.FullPath, "異動型態:異動檔案(" + e.ChangeType.ToString + ")觸發事件:Changed")

        End Sub

        Public Sub WatchMessage(ByVal strpFileName As String, ByVal strpMessage As String'主要執行程式

            Dim st As String

            Dim FileName As String

            Dim strp As String

            FileName = Mid(strpFileName, 52, 15)

            strp = Mid(strpFileName, 1, 52)

            If FileName = "Motion.log" Or FileName = "System.log" Or FileName = "Sensor.log" Or FileName = "User.log" Then

                Dim myFileStream As New FileStream(strpFileName, FileMode.Truncate, IO.FileAccess.Read)

                Dim r As New StreamReader(myFileStream, System.Text.Encoding.Default)

                Try

                    While r.Peek() > -1

                        st = r.ReadLine() & ControlChars.CrLf

                    End While

                    If FileName = "System.log" Then

                        字串解析(st)

                    Else

                    End If

                    If FileName = "Sensor.log" Then

                        字串解析1(st)

                    Else

                    End If

                    If FileName = "User.log" Then

                        字串解析2(st)

                    Else

                    End If

                    If FileName = "Motion.log" Then

                        字串解析3(st)

                    Else

                    End If

                Catch ex As IOException

                End Try

                ' MsgBox("xxx")

                r.Close()

            End If

        End Sub

     

    • 已編輯 李小廷 2010年7月26日 上午 09:26
    2010年7月26日 上午 09:24
  •     Private Sub 字串解析(ByVal st As String) 'System.log

            Dim 日期As String

            Dim 時間As String

            Dim 頻道As String

            'Dim 名稱As String

            Dim 動作As String

            Dim DelArr() As Char

            Dim Delm As String = " " '以空白分離字串,成為字元之型式

            Dim DT As String

            Dim 日期時間As String

            DelArr = Delm.ToCharArray '分離成字元陣列

            DT = st.Split(DelArr).GetValue(0)

            時間= st.Split(DelArr).GetValue(1)

            頻道= st.Split(DelArr).GetValue(5)

            '名稱= st.Split(DelArr).GetValue(6)

            動作= st.Split(DelArr).GetValue(6)

            日期= Mid(DT, 7, 2) + "/" + Mid(DT, 1, 2) + "/" + Mid(DT, 4, 2)

            日期時間= "20" + 日期+ " " + 時間

            Dim SDt As String = "CONVERT(DATETIME,'" & 日期時間& "' ,102)"

            Using cn As New SqlConnection(DataSource)

                cn.Open()

                Using cmd As New SqlCommand

                    cmd.Connection = cn

                    cmd.CommandText = "insert into 紀錄( 日期時間, 頻道, 動作)" _

                                      & "values( " & SDt & ",'" & 頻道& "','" & 動作& "')"

                    cmd.ExecuteNonQuery()

                End Using

            End Using

        End Sub

     

    End Class

    2010年7月26日 上午 09:25
  • 有錯誤訊息嗎? 有試著下中斷點看看嗎?


    歡迎參觀我的Blog.NET菜鳥自救會
    2010年7月26日 上午 09:35
    版主
  • FileStream.Read方法有一個多載是可以指定從特定位置讀取特定長度.

    照這個用法來說, 你可以在每次讀完時, 記錄你所讀最後一次的位置, 下一次就接著讀.

    以下連結有一個類似的例子.

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/23083d65-0844-43f3-883e-606225e87333


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年7月26日 下午 02:28
    版主