我的情况如下:
我有 1 个程序在运行时将其操作连续记录到 txt 文件中。它在运行时从不关闭文件。我不能修改这个程序。
我想用我的其他应用程序(用 VB.NET VS 2005 编写)监视这个文件。我的问题是,写入此日志的数据似乎没有立即注册。
我尝试使用 FileSystemWatch 来监视文件的更新。这种方法的问题是我不会立即收到正在写入数据的通知。使用资源管理器手动浏览到文件夹然后对其进行排序会触发更改的事件(不要问我为什么)。如果文件被其他应用程序关闭,我可能还会收到通知。
我也试过轮询文件并读取它的最后写入日期。这绝对只有在每次写入后都关闭文件时才有效。
是否有任何方法可以完成此监视,而无需应用程序写入日志关闭文件并重新打开它或手动访问正在写入的文件夹。
这是我的文件监视代码:
If IO.File.Exists(recorder_path) Then
Dim recorder_dir As String = recorder_path.Remove(recorder_path.LastIndexOf("\"))
Dim recorder_name As String = recorder_path.Substring(recorder_path.LastIndexOf("\") + 1)
recorder_watcher = New System.IO.FileSystemWatcher()
recorder_watcher.Path = recorder_dir
recorder_watcher.Filter = recorder_name
recorder_watcher.NotifyFilter = NotifyFilters.Size
AddHandler recorder_watcher.Changed, AddressOf recorder_update
recorder_watcher.EnableRaisingEvents = True
End If
Private Sub recorder_update(ByVal source As Object, ByVal event_args As System.IO.FileSystemEventArgs)
'Do Stuff
End Sub
我在 W7 和 XP 上运行这个应用程序并且只访问本地文件夹。
更新,另一种方法:
下面的代码似乎工作得足够快:
Dim new_txt As String = ""
Dim fs As New FileStream(recorder_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
Dim file_reader = New StreamReader(fs)
file_reader.ReadToEnd()
While 1
new_txt = ""
System.Threading.Thread.Sleep(5)
System.Windows.Forms.Application.DoEvents()
new_txt += file_reader.ReadToEnd().ToUpper()
If (new_txt.Length > 0)
'Do stuff w/new txt
End If
End While
每次日志记录过程写入文件时,这似乎都会给我更新。
谢谢,
伊恩