C#检测文件通过不同的文件夹移动
我想检测特定文件夹上的每个文件更改(数据更改除外)。 我决定使用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上重播
文件删除/文件创建功能是文件移动的功能。 如果您只是将文件从文件夹移动到文件夹,它与重命名类似,但如果将文件从一个磁盘移动到另一个磁盘或在计算机之间移动文件,该如何处理?
而且,如果我正在观看指定的文件夹,只要该文件不存在,那么它可能已被删除:)
如果您确定要捕获文件移动的“事件”(从监视的文件夹到监视的子文件夹),我将维护最近删除的文件的列表,并在每个文件创建事件时检查文件是否为该列表,表明事实上的文件移动。
您可以使用文件系统筛选驱动程序来跟踪文件重命名操作。 实际上,FS Filter比FileSystemWatcher更好。 FileSystemWatcher不提供某些情况下的可靠性和灵活性(您可以看到有关FileSystemWatcher的问题数量以及它的小故障和限制)。
FS Filter允许您在到达文件系统后立即跟踪请求。
您可以编写自己的过滤器驱动程序,或使用我们的CallbackFilter产品。
这不是问题的真正解决方案,但我设法有一个快速和肮脏的解决方案:
首先我缓冲所有事件一段时间(100ms测试,但我们会看到它的速度有多快)。
如果缓冲区中的事件是100ms,我会检查是否还有其他事件。 因此,对于删除我搜索所有创建和创建我搜索所有删除。
如果我找到一个,我只用一个移动事件来替换这两个事件。
这个工作周期有一些riscs:
1.)我不能说先来,删除或创建。 似乎每次都不一样
2.)如果延迟很短,文件将被删除并丢失:-(
但只要我没有更好的解决方案,我必须忍受这一点。
链接地址: http://www.djcxy.com/p/58339.html