.net 监视当前被另一进程锁定/打开的文件

.net 监视当前被另一进程锁定/打开的文件,.net,vb.net,filesystemwatcher,fileinfo,.net,Vb.net,Filesystemwatcher,Fileinfo,我的设想如下: 我有一个程序,它在运行时将其动作连续记录到一个txt文件中。它从不在文件运行时关闭文件。我不能修改这个程序 我想用我的其他应用程序(用VB.NET VS 2005编写)监视此文件。我的问题是,似乎写入此日志的数据不会立即注册 我尝试使用FileSystemWatch来监视文件的更新。这种方法的问题是,我不会立即收到写入数据的通知。使用资源管理器手动浏览文件夹,然后对其进行排序会触发已更改的事件(不要问我为什么)。如果文件被其他应用程序关闭,我可能也会收到通知 我还尝试了轮询文件并

我的设想如下:

我有一个程序,它在运行时将其动作连续记录到一个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
每次日志进程写入文件时,这似乎都会给我更新

谢谢


Ian

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


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

什么操作系统?是否通过文件共享访问该文件?如果是的话,服务器上有什么操作系统?我在Windows7上,但程序需要在Windows7和XP上运行。我正在本地驱动器上查看文件,因此没有共享。如何知道系统是否有文件系统筛选器驱动程序。它是XP和7的标准配置吗?这些是我运行此应用程序的操作系统。@Ian,文件系统过滤器驱动程序是您编写的内核模式驱动程序。它们不是预先安装的东西。有关详细信息,请参阅。我们公司提供了一款产品CallbackFilter,它提供了一个预构建的驱动程序,可以调用您的用户模式代码来执行操作,并且可以避免您构建驱动程序。好的,谢谢。我想我会使用我在问题中发布的方法。它似乎工作得很好。