我想检测特定文件夹上的每个文件更改(数据更改除外)。我决定使用System.IO.FileSystemWatcher来管理它。
//
// fileSysWatchFile
//
this.fileSysWatchFile.EnableRaisingEvents = true;
this.fileSysWatchFile.IncludeSubdirectories = true;
this.fileSysWatchFile.NotifyFilter = System.IO.NotifyFilters.FileName;
this.fileSysWatchFile.SynchronizingObject = this;
this.fileSysWatchFile.Created += new System.IO.FileSystemEventHandler(this.fileSysWatchFile_Created);
this.fileSysWatchFile.Deleted += new System.IO.FileSystemEventHandler(this.fileSysWatchFile_Deleted);
this.fileSysWatchFile.Renamed += new System.IO.RenamedEventHandler(this.fileSysWatchFile_Renamed);
尽可能好......检测到新文件。检测到文件删除。检测到文件重命名。
当我将文件移动到子文件夹时,它首先检测文件删除,然后检测新文件。
除了路径之外,我希望移动与重命名相同。似乎不是。我能以保存的方式检测文件移动吗?
顺便说一句......我只想检测文件更改而不是目录更改。
修改
其他信息为什么我必须检测移动而不能使用删除,创建:
我想在其他驱动器上重播相同的更改。如果我先删除,我会删除影子文件。然后我得到了创建文件事件,原始文件已经丢失:-(。
所以我有一个驱动器A,这是看到的驱动器...... 和驱动器B,其文件具有相同的文件名。
所有文件更改exept数据更改应在驱动器B上重播。
答案 0 :(得分:1)
文件删除/文件创建功能是文件移动的背后。如果您只是将文件从文件夹移动到文件夹,它类似于重命名,但是如果将文件从一个磁盘移动到另一个磁盘,或者在机器之间移动文件呢?
并且,如果我正在观看指定的文件夹,只要该文件不在那里,它也可能已被删除:)
如果您确定要捕获文件移动的“事件”(从监视文件夹到监视的子文件夹),我会维护一个最近删除的文件列表,并在每个文件创建事件时,检查文件是否是它列出,表示事实上的文件移动。
答案 1 :(得分:1)
您可以使用文件系统筛选器驱动程序来跟踪文件重命名操作。实际上,FS Filter是比FileSystemWatcher更好的方法。 FileSystemWatcher在某些情况下不提供可靠性和灵活性(您可以看到有关FileSystemWatcher的问题数量及其故障和限制)。
FS Filter可让您在到达文件系统后立即跟踪请求。
您可以编写自己的过滤器驱动程序,也可以使用我们的CallbackFilter产品。
答案 2 :(得分:0)
这不是问题的真正解决方案,但我设法有一个快速而肮脏的解决方案:
首先,我暂时缓冲所有事件(用100毫秒测试,但我们会看到它的速度有多快)。
如果缓冲区中的事件是100ms,我会检查是否还有其他依赖事件。所以对于删除我搜索所有创建和创建我搜索所有删除。
如果我找到一个,我只用一个移动事件替换这两个事件。
这种工作方式有一些危险:
1.)我不能说先出现什么,删除或创建。似乎这是每次都不同的
2.)如果延迟很短,文件将被删除并丢失: - (
但只要我没有更好的解决方案,我就必须忍受这个。