监视文件当前由另一个进程锁定/打开

时间:2012-12-19 22:18:27

标签: .net vb.net filesystemwatcher fileinfo

我的方案如下:

我有一个程序在运行时将其操作连续记录到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

每次日志记录过程写入文件时,这似乎都会给我更新。

谢谢,

伊恩

1 个答案:

答案 0 :(得分:2)

事实上,FileSystemWatcher不会给你太多,并且定期读取文件会有所帮助,但前提是文件是以共享模式打开的,允许其他进程读取文件。

另一种方法是使用文件系统过滤器驱动程序,它立即捕获所有写入操作。如果驱动程序安装在文件所在的同一系统上(即过滤器无法在远程磁盘上运行),这将起作用。