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

Jim*_*ret 0 c# filesystemwatcher

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

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

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

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

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

谢谢,吉姆

Cor*_*son 5

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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