1

我有一些代码可以监视文件系统的更改并更新文件表示的容器。在您重命名目录之前,大多数情况下都可以正常工作。我希望为重命名目录的所有文件和子文件夹获得一个重命名事件,因为它们具有新路径,但我只收到一条消息,表明父目录已更改名称。有没有我忘记的事件,或者需要设置的标志?目前我正在处理目录重命名并遍历我的集合以将文件更新为新名称,但我觉得应该有一些东西可以接收每个文件的通知。

我的设置:

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

3 回答 3

2

我认为如果容器更改其名称,通常不会认为包含的文件正在更改。这就是为什么您没有收到包含文件的事件的原因。

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

当您收到目录重命名事件时,您可以在您的表示中找到该目录,并为从该分支中​​提取的每个文件触发更新。

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

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

于 2012-07-25T21:42:22.237 回答
1

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

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

Folder1 (watched)   
  File1   
  Folder2
    File2

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

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

于 2012-07-25T22:23:14.777 回答
0

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

watcher.IncludeSubdirectories = true;
于 2012-07-26T09:57:48.253 回答