C# 为什么我没有注意到文件是从FileSystemWatcher重命名的

C# 为什么我没有注意到文件是从FileSystemWatcher重命名的,c#,.net,wpf,C#,.net,Wpf,我有一些代码监视文件系统的更改,并更新文件表示的容器。在重命名目录之前,所有操作都在大部分情况下有效。我希望为重命名目录的所有文件和子文件夹获取重命名事件,因为它们有新的路径,但我只收到一条消息,表明父目录已更改名称。是否有我忘记的事件,或需要设置的标志?目前,我正在处理目录重命名,并在我的集合中进行迭代,以将文件更新为新名称,但我觉得应该有一些东西来接收每个文件的通知 我的设置: FileSystemWatcher watcher = new FileSystemWatcher(item.Pa

我有一些代码监视文件系统的更改,并更新文件表示的容器。在重命名目录之前,所有操作都在大部分情况下有效。我希望为重命名目录的所有文件和子文件夹获取重命名事件,因为它们有新的路径,但我只收到一条消息,表明父目录已更改名称。是否有我忘记的事件,或需要设置的标志?目前,我正在处理目录重命名,并在我的集合中进行迭代,以将文件更新为新名称,但我觉得应该有一些东西来接收每个文件的通知

我的设置:

FileSystemWatcher watcher = new FileSystemWatcher(item.Path);
watcher.EnableRaisingEvents = true;
watcher.Created += new System.IO.FileSystemEventHandler(OnMediaCreated);
watcher.Deleted += new System.IO.FileSystemEventHandler(OnMediaDeleted);
watcher.Changed += new System.IO.FileSystemEventHandler(OnMediaChanged);
watcher.Renamed += new System.IO.RenamedEventHandler(OnMediaRenamed);

我不认为如果容器改变它的名字,通常会认为包含的文件会发生变化。这就是为什么您不能为包含的文件获取事件

我建议您创建目录结构的双链接树表示,以便每个文件和目录都知道它所在的容器。然后在文件表示形式中进行ToString()重写,该文件表示形式将树遍历到根目录,以生成显示字符串

当您获得目录重命名事件时,您可以在表示中找到目录,并触发从此分支中弹出的每个文件的更新

这样,您就不必循环处理事情,而是使用递归,如果您觉得递归更优雅的话


另外,请注意FileSystemWatcher有一个缓冲区溢出问题,您可能需要检查它,以免丢失事件。

好的,首先,请在文章中使用一致的术语。您提到的目录、文件夹和文件几乎可以互换。为了便于讨论,我将把它放到文件夹和文件中。根据您的描述,您正在查看一个包含文件和子文件夹的文件夹。重命名文件夹后,是否也会引发所有文件(以及子文件夹,如果适用)的介质重命名事件?不,我不相信你会得到它们

FileSystemWatcher挂接以监视文件夹的内容,而不是文件夹本身。您可以通过挂接到文件夹并重命名文件夹,然后重命名文件夹中的项目来验证此行为。(并显示更改的完整路径)您会注意到重命名项目的路径保留了原始文件夹名称。重命名文件夹不会使监视程序无效,但也不会捕获事件。但是,如果您在关注的文件夹下有一个子文件夹,并且该子文件夹下有一个文件,并且重命名该子文件夹及其子文件,则子文件夹的完整路径将反映其父文件夹的名称更改。有点难以描述,但是:(IncludeSubdirectories=true)

重命名文件夹1,然后重命名文件1。未检测到Folder1的名称更改,而且不,文件1也不会触发更改。它的名字没有变。更改Folder1的名称后重命名File1仍将显示“Folder1”作为路径。 将检测到重命名文件夹2并报告新名称。将检测到在重命名Folder2后重命名File2,并且File2的完整路径将显示更新的Folder2文件夹名称


如果您想检测重命名到监视的目录,那么您实际需要做的是使用设置为您实际感兴趣的目录的筛选器来监视其上方的目录级别。可以将一个FSW与IncludeSubDirectory一起使用,也可以使用两个文件系统监视程序,一个监视文件夹,另一个监视其内容。检测到文件夹更改时,根据需要使用文件夹名称更改更新外部引用,然后重新初始化content watcher one,以便正确返回路径名。

您需要启用FileSystemWatcher对象以包括子目录

watcher.IncludeSubdirectories = true;

我道歉。我没有太多的时间来校对,因为我在下班的路上发布了这篇文章,想尽快把我的问题提出来。你完全理解我想做什么。以下是我假设您将获得目录和目录中每个文件的消息的原因:我将一些文本和图像绑定到文件路径,因此当它们重命名目录时,这些绑定将失败。图像试图引用旧路径,因此失败。基本问题是文件不知道目录被重命名,所以我必须更新所有这些路径。如果Folder1的父目录被重命名怎么办?你在哪里停止监视父母?更不用说为文件触发的所有事件仍然为您提供了错误的旧路径。FileSystemWatcher存在严重缺陷。该功能已启用。问题不在于我没有收到任何消息,而在于我的容器中的文件在路径因目录重命名而更改时没有收到任何要更新的消息。我喜欢你的想法,但在我的结构中,没有表示目录。仅显示文件。它是一个列表框,所以我对文件路径的某些部分进行分组,以按目录列出内容。那很好。然后,如果用户重命名目录,我的文件将不再更新,因为它们仍然绑定到旧路径(因为它们没有得到重命名事件)。我想我将不得不继续手动浏览这些项目,并自己强制更新。
watcher.IncludeSubdirectories = true;