【问题标题】:C# Detect file moves trough different foldersC# 检测文件在不同文件夹中的移动
【发布时间】:2010-11-27 23:35:04
【问题描述】:

我想检测特定文件夹上的每个文件更改(数据更改除外)。我决定使用 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,其中包含具有相同文件名的文件。

除数据更改外的所有文件更改都应在驱动器 B 上重放。

【问题讨论】:

  • 主要问题是我不能说删除和创建事件之间的时间有多长。因此,我无法通过延迟路径检查检测它来实现保存解决方法。
  • 对于文件移动来说,任何超过几秒钟的时间都是一个非常令人惊讶的值,因为 Windows 实际上只是更新文件路径,即使它说它是删除 + 创建
  • AFAIK FileSystemWatcher 是一种尽力而为的方法。通知缓冲区有限,当缓冲区已满时,通知将被静默删除。因此,当系统繁忙时,您的应用可能会错过一些事件。
  • 我不认为缺少什么,因为我得到了删除和创建事件。

标签: c# move filesystemwatcher


【解决方案1】:

文件删除/文件创建功能是文件移动背后的功能。如果您只是将文件从文件夹移动到文件夹,则类似于重命名,但是如果将文件从一个磁盘移动到另一个磁盘,或者在机器之间移动文件呢?

而且,如果我在看一个指定的文件夹,只要该文件不存在,它还不如被删除:)

如果您确定要捕获文件移动“事件”(从监视文件夹到监视子文件夹),我会维护最近删除文件的列表,并在每个文件创建事件时检查文件是否它是那个列表,表示事实上的文件移动。

【讨论】:

  • 完全正确...我必须区分磁盘移动和移动到其他磁盘...请查看我添加的信息以了解我的问题。
  • 您确定不能使用分布式文件系统服务做到这一点吗?文件复制还有其他解决方案,你不需要重新发明轮子。
  • 如果执行移动到另一个磁盘,我什至只会得到一个删除事件。我的情况不是这样...
  • 我不想复制这些文件。数据不一样。只有文件名和磁盘的相对路径是相等的。
  • 所以,文件从 A 移动到磁盘 C -> 你应该从 B 中删除它;文件从 C 移动到磁盘 A -> 你应该在 B 上创建它;来自 A 的文件移动到磁盘 A -> 你应该在 B 上播放它;对吗?
【解决方案2】:

您可以使用文件系统过滤驱动程序来跟踪文件重命名操作。实际上,FS Filter 是比 FileSystemWatcher 更好的方法。 FileSystemWatcher 在某些情况下不提供可靠性和灵活性(您可以查看有关 FileSystemWatcher 的问题数量以及它的故障和限制)。

FS 过滤器可让您在请求到达文件系统后立即对其进行跟踪。

您可以编写自己的过滤器驱动程序,或使用我们的CallbackFilter 产品。

【讨论】:

  • 所以没有免费的解决方案或codesample?我猜你想卖掉你的程序;)
  • 为什么不呢,Windows Driver Kit 包含一个示例 FS 过滤器驱动程序。但总的来说,内核模式开发非常耗时,并且需要相当高的能力。这就是为什么我们提供的解决方案让任何开发人员无需在内核模式下手动编码即可获得 FS 过滤器驱动程序的所有优势。
【解决方案3】:

这不是问题的真正解决方案,但我设法找到了一个快速而肮脏的解决方案:

首先,我将所有事件缓冲一段时间(测试时间为 100 毫秒,但我们会看到它的速度有多快)。

如果缓冲区中的事件为 100 毫秒,我会检查其中是否还有其他相关事件。因此,对于删除,我搜索所有创建,对于创建,我搜索所有删除。

如果我找到一个,我只用一个移动事件替换这两个事件。

这个解决方法有一些风险:
1.) 我不能说先是删除还是创建。好像每次都不一样
2.) 如果延迟太短,文件被删除并丢失:-(

但只要我没有更好的解决方案,我就不得不忍受这个。

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多