2012-07-25 74 views
1

我有一些代码监视文件系统的变化并更新文件表示的容器。所有作品的大部分,直到你重命名一个目录。我希望为重命名目录的所有文件和子文件夹获取重命名事件,因为它们有新路径,但是我只收到一条消息,说明父目录已更改名称。有没有我忘记的事件,或需要设置的旗帜?目前,我正在处理目录重命名并遍历我的集合以将文件更新为新名称,但是我觉得应该有一些东西来接收每个文件的通知。为什么我没有注意到文件从FileSystemWatcher重命名

我的设置:

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); 

回答

2

我不认为人们通常认为,如果容器改变它的名字所包含的文件被改变。这就是为什么你没有得到包含文件的事件。

我可以建议您创建一个目录结构的双链树表示,以便每个文件和目录都知道它所在的容器。然后在遍历您的文件表示中创建一个ToString()覆盖树到根来构建显示字符串。

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

这样你就不需要循环遍历事物,而是使用递归,如果这看起来更优雅。

此外,请注意,FileSystemWatcher存在缓冲区溢出问题,您可能希望检查出所以您不会丢失事件。

+0

我喜欢你的想法,但在我的结构中,导演没有代表。只显示文件。这是一个列表框,所以我在文件路径的一部分上进行了一些分组,以按目录列出内容。这工作正常。然后,如果用户重命名目录,我的文件不再更新,因为它们仍旧绑定到旧路径(因为它们没有得到重命名事件)。我想我将不得不继续手动完成这些项目并自己强制更新。 – steveg89 2012-07-26 11:26:25

1

好的,首先,请在帖子中使用一致的术语。你提到的目录,文件夹和文件几乎可以互换。为了讨论的缘故,我会把它放到文件夹和文件中。从你所描述的你正在看一个包含文件和可能的子文件夹的文件夹。您重命名该文件夹,并且您期望所有文件(以及子文件夹,如果适用)的媒体重命名事件也会引发?不,我不相信你会得到他们。

FileSystemWatcher挂钩以观察文件夹的内容,而不是文件夹本身。您可以通过挂钩到文件夹并重命名文件夹,然后重命名文件夹中的项目来验证此行为。 (并显示更改的完整路径),您会注意到重命名项目的路径保留了原始文件夹名称。重命名该文件夹不会使观察者失效,但它也不会捕获该事件。但是,如果在受监视文件夹下有一个子文件夹,并在其下有一个文件,并重命名该子文件夹及其子文件,则该子文件的完整路径将反映其父文件夹的名称更改。硬样来形容,但:(IncludeSubdirectories =真)

Folder1 (watched) 
    File1 
    Folder2 
    File2 

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

如果要检测重命名为观察目录,则实际需要执行的操作是使用设置为您实际感兴趣的目录的Filter来监视其上的目录级别。可以使用一个带有IncludeSubdirectories的FSW,或者两个文件系统监视器,一个监视文件夹,另一个监视内容。当检测到文件夹更改时,根据需要更新您的外部参考文件夹名称更改,然后重新初始化内容观察器,以便正确返回路径名称。

+0

我很抱歉。当我发布这条消息时,我没有太多时间来验证阅读,因为我正在离开工作岗位,并想快速解决问题。你正确理解我想做什么。下面是我认为你会得到目录中的每个文件以及目录的消息的原因:我将一些文本和图像绑定到文件路径,因此当它们的目录被重命名时,那些绑定会失败。图像试图引用旧的路径,所以事情失败。基本的问题是文件不知道目录被重命名,所以我必须做更新所有这些路径的工作。 – steveg89 2012-07-26 11:21:59

+0

如果Folder1的父项被重命名,该怎么办?你在哪里停止监视父母?更不用说为文件而开发的所有事件仍然给你错误的老路。 FileSystemWatcher存在严重缺陷。 – MoonStom 2016-03-25 15:47:26

0

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

watcher.IncludeSubdirectories = true; 
+0

已经打开。问题不在于我没有收到任何消息,而是因为目录重命名导致其路径更改时,我的容器中的文件没有收到任何更新消息。 – steveg89 2012-07-26 11:22:51

相关问题