filesystemwatcher是监视文件的正确方法吗

本文关键字:方法 监视 文件 filesystemwatcher | 更新日期: 2023-09-27 18:26:02

我知道这是一个普遍的问题,但我只是打开这个讨论。我不得不假设其他人一定也做过类似的事情,我不想做很多代码来发现我的解决方案不起作用。

这是我的东西。用户会将一个文件作为OLE对象添加到数据库中,并将一些态度与文件相关联——它所关联的项目、版本等。我使用的是Access——客户的选择不是我的!

当他们想要编辑它时,他们需要将其签出。在这个阶段,我想监视文件,当他们保存它时,将它恢复回数据库。

我认为文件系统观察程序是我最好的方法——监视更改,并在触发更改时将其保存回数据库,这样我就可以访问该文件。如果它仍然打开,应用程序将锁定它,所以我知道用户还没有完成。

简言之,我的问题是,文件系统观察者是解决这个问题的正确方法吗?有人提出其他建议吗?

谢谢,Jim

filesystemwatcher是监视文件的正确方法吗

正如M4GNV5所说,FileSystemWatcher将适用于此,但它有点过头了。在代码中使用one非常复杂,因为它非常容易出错,并且需要非常精确的使用模式才能成功。它也有一定的开销,因为它需要在内核模式下挂接到文件系统驱动程序。

另一种解决方案可能使用轮询。

FileInfo info = new FileInfo(filePath);
DateTime oldTime = info.LastWriteTimeUtc;
while(true)
{
    do
    {
        await Task.Wait(1000);
        info.Refresh();
    } while(info.LastWriteTimeUtc == oldTime);
    try
    {
        using(Stream s = File.OpenRead(filePath))
        {
            // ok, file was modified and is unlocked. copy back.
        }
        break;
    }
    catch(IOException)
    {
        // file is locked, retry.
        oldTime = info.LastWriteTimeUtc;
    }
}

这首先等待文件的修改时间发生更改,然后检查是否已解锁。

要监视单个文件还是目录?

FileSystemWatcher被设计为监视目录http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx告诉你

因此,为了监视单个文件FileSystemWatcher可能是OP但是为了监视整个目录,它的正确选择

您可以使用FileSystemWatcher来监视单个文件。您可以将Filter属性设置为您感兴趣的特定文件。或者将其设置为*.mdb(或类似文件),并比较FileSystemEventArgs路径,以便仅在Change事件是针对您感兴趣文件的情况下执行某些操作。

伪代码:

  • 当他们签出该文件时,在文件系统上创建它,并创建一个文件系统观察程序,该观察程序具有与该文件匹配的Filter并订阅Changed事件
  • 在Changed事件中,检查您是否可以访问该文件,即锁定是否已释放,如果可以,请执行您想做的任何操作

这是最好的解决方案吗?实际上取决于几个因素。他们能否保存正在进行的工作,从而锁定文件,然后退出而不再次保存?如果是这样,您将不会得到第二个Changed事件。

尽管很粗糙,轮询(在计时器上检查文件的状态以及上次修改的属性是否已更改)可能是更好的解决方案。

如果他们在应用程序中单击"保存",但不关闭它怎么办?即使在观察者报告进行了更改之后,该文件仍然可能被锁定且无法读取,但这取决于编辑器。

另一种方法是自己直接启动编辑应用程序,并监控流程以查看用户何时关闭应用程序,尽管这可能会对选项卡式编辑器产生问题,因为选项卡式编辑器在同一流程中打开多个文档。

因此,为了提高可靠性,像FTP客户端这样的应用程序通常会使用定时循环,监控文件大小和修改日期属性的变化,然后对文件进行操作。

需要注意的是,在采取行动之前可能需要延迟,因为病毒扫描仪也可以在发生更改后锁定和扫描文件,从而阻止您的代码立即访问。