filesystemwatcher是监视文件的正确方法吗
本文关键字:方法 监视 文件 filesystemwatcher | 更新日期: 2023-09-27 18:26:02
我知道这是一个普遍的问题,但我只是打开这个讨论。我不得不假设其他人一定也做过类似的事情,我不想做很多代码来发现我的解决方案不起作用。
这是我的东西。用户会将一个文件作为OLE对象添加到数据库中,并将一些态度与文件相关联——它所关联的项目、版本等。我使用的是Access——客户的选择不是我的!
当他们想要编辑它时,他们需要将其签出。在这个阶段,我想监视文件,当他们保存它时,将它恢复回数据库。
我认为文件系统观察程序是我最好的方法——监视更改,并在触发更改时将其保存回数据库,这样我就可以访问该文件。如果它仍然打开,应用程序将锁定它,所以我知道用户还没有完成。
简言之,我的问题是,文件系统观察者是解决这个问题的正确方法吗?有人提出其他建议吗?
谢谢,Jim
正如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客户端这样的应用程序通常会使用定时循环,监控文件大小和修改日期属性的变化,然后对文件进行操作。
需要注意的是,在采取行动之前可能需要延迟,因为病毒扫描仪也可以在发生更改后锁定和扫描文件,从而阻止您的代码立即访问。