使用FileSystemWatcher检测移动的文件

Ash*_*Ash 20 c# filesystemwatcher

我意识到FileSystemWatcher不提供Move事件,而是为同一个文件生成单独的Delete和Create事件.(FilesystemWatcher正在观察源文件夹和目标文件夹).

但是,我们如何区分真正的文件移动和一些文件的随机创建,该文件恰好与最近删除的文件同名?

FileSystemEventArgs类的某种属性,例如"AssociatedDeleteFile",如果它是移动的结果,则分配已删除的文件路径,否则为NULL,这将是很好的.但当然这不存在.

我也理解FileSystemWatcher在基本的文件系统级别运行,因此"移动"的概念可能仅对更高级别的应用程序有意义.但如果是这种情况,人们会建议在我的应用程序中使用什么样的算法来处理这种情况?

根据反馈更新:

FileSystemWatcher类似乎看到将文件移动为2个不同的事件,删除原始文件,然后在新位置创建.

不幸的是,这些事件之间没有提供"链接",因此如何区分文件移动和普通的删除或创建并不明显.在操作系统级别,移动被特别处理,您可以几乎立即移动说1GB文件.

一些答案建议在文件上使用散列来在事件之间可靠地识别它们,我将合理地采用这种方法.但如果有人知道如何更简单地发现一个动作,请留下答案.

Nad*_*zie 13

根据文件:

常见的文件系统操作可能会引发多个事件.例如,当文件从一个目录移动到另一个目录时,可能会引发几个OnChanged和一些OnCreated和OnDeleted事件.移动文件是一项复杂的操作,由多个简单操作组成,因此可以引发多个事件.

因此,如果你试图非常小心地检测移动,并且具有相同的路径是不够好的,那么你将不得不使用某种启发式方法.例如,使用文件名,大小,上次修改时间等为源文件夹中的文件创建"指纹".当您看到任何可能表示移动的事件时,请检查新文件的"指纹".