我意识到FileSystemWatcher没有提供移动事件,相反,它将为同一文件生成单独的删除和创建事件。( FilesystemWatcher同时监视源文件夹和目标文件夹)。
然而,我们如何区分真正的文件移动和某个随机创建的文件,该文件恰好与最近删除的文件同名?
FileSystemEventArgs类的某种属性,如"AssociatedDeleteFile“,如果是移动的结果,则分配给删除的文件路径,否则为NULL,这将是很好的。但这当然不存在。
我还了解到FileSystemWatcher是在基本文件系统级别操作的,因此“移动”的概念可能只对更高级别的应用程序有意义。但如果是这种情况,人们会推荐哪种算法来处理我的应用程序中的这种情况?
根据反馈进行更新:
FileSystemWatcher类似乎将移动文件看作是两个不同的事件,一个是删除原始文件,然后是在新位置创建。
不幸的是,在这些事件之间没有提供“链接”,因此如何区分文件移动和正常的删除或创建并不明显。在操作系统级别,一次移动是特殊处理的,你几乎可以瞬间移动一个1 1GB的文件。
有几个答案建议对文件使用散列,以便在事件之间可靠地识别它们,我将明确地采用这种方法。但是,如果有人知道如何更简单地检测移动,请留下答案。
发布于 2009-08-17 04:13:11
我冒险猜测“移动”确实不存在,所以你真的只需要寻找“删除”,然后将该文件标记为“可能被移动”的文件,然后如果你很快看到它的“创建”,我想你可以假设你是正确的。
您是否遇到过随机创建文件影响您的移动检测的情况?
发布于 2009-08-17 04:17:54
可能需要尝试the documentation中提到的OnChanged和/或OnRenamed事件。
发布于 2020-08-24 08:09:27
StorageLibrary类can track moves。来自Microsoft的示例:
StorageLibrary videosLib = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
StorageLibraryChangeTracker videoTracker = videosLib.ChangeTracker;
videoTracker.Enable();
完整的示例可以在here中找到。然而,看起来你只能跟踪Windows "known libraries“内部的变化。
您还可以尝试使用StorageFolder.TryGetChangeTracker()获取StorageLibraryChangeTracker。但是您的文件夹必须在同步根目录下,您不能使用此方法来获取文件系统中的任意文件夹。
https://stackoverflow.com/questions/1286114
复制相似问题