filesystemwatcher是监控文件的正确方法吗?

时间:2014-10-08 19:53:02

标签: c# filesystemwatcher

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

这就是我所拥有的。用户将一个文件作为OLE对象添加到数据库,并将一些态度与文件相关联 - 项目与之关联,版本等。我正在使用Access - 客户选择不是我的!

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

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

所以简而言之,我的问题是文件系统观察者正确的方法来解决这个问题?有人建议别的吗?

谢谢, 吉姆

4 个答案:

答案 0 :(得分:4)

正如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;
    }
}

首先等待文件的修改时间改变,然后检查它是否已解锁。

答案 1 :(得分:2)

您想要监控单个文件还是目录?

FileSystemWatcher旨在以http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx告诉您

来观看目录

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

答案 2 :(得分:1)

您可以使用FileSystemWatcher监视单个文件。您可以将Filter属性设置为您感兴趣的特定文件。或者将其设置为* .mdb(或类似),并将FileSystemEventArgs路径与仅在您感兴趣的文件的Change事件中执行某些操作进行比较。< / p>

伪代码:

  • 当他们签出文件时,在文件系统上创建它并创建一个文件系统观察器,其中包含与该文件匹配的过滤器并订阅Changed事件
  • 在Changed事件中,检查您是否可以访问该文件,即是否已释放锁定,如果是,则执行您想要执行的操作

这是最好的解决方案吗?真的取决于几个因素。他们可以保存正在进行的工作,从而使文件保持锁定状态,然后退出而不再保存吗?如果是这样,你就不会得到第二个Changed事件。

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

答案 3 :(得分:0)

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

另一种方法是直接启动编辑应用程序并监视进程以查看用户何时关闭应用程序,尽管这可能会导致选项卡编辑器在同一进程中打开多个文档时出现问题。

因此,对于可靠性,FTP客户端等应用程序通常使用定时循环并监视文件大小和日期修改属性以进行更改,然后对文件执行操作。

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