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

时间:2012-07-25 21:26:53

标签: c# .net wpf

我有一些代码可以监视文件系统的更改并更新文件表示的容器。在重命名目录之前,大部分都可以工作。我希望为重命名的目录的所有文件和子文件夹获取重命名事件,因为它们有新路径,但我只收到父目录更改了名称的单个消息。有遗忘的事件,还是需要设定的旗帜?目前我正在处理目录重命名并迭代我的集合以将文件更新为新名称,但我觉得应该有适当的地方来接收每个文件的通知。

我的设置:

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

3 个答案:

答案 0 :(得分:2)

如果容器更改了名称,我认为通常不会考虑包含的文件。这就是为什么你没有得到包含文件的事件。

我建议您创建目录结构的双链接树表示,以便每个文件和目录都知道它所在的容器。然后在遍历树的文件表示中进行ToString()覆盖到root来构建display-string。

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

这样你就不必循环遍历事物,而是使用递归,如果这对你来说更优雅。

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

答案 1 :(得分:1)

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

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

Folder1 (watched)   
  File1   
  Folder2
    File2

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

如果要检测重命名到监视目录,那么您实际需要做的是观察其上方的目录级别,并将过滤器设置为您真正感兴趣的目录。使用一个FSW与IncludeSubdirectories,或者两个文件系统观察者,一个看文件夹,另一个看它的内容。检测到文件夹更改时,根据需要更新文件夹名称更新外部引用,然后重新初始化内容观察程序,以便正确返回路径名。

答案 2 :(得分:0)

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

watcher.IncludeSubdirectories = true;