添加带子目录的文件夹的FileSystemWatcher事件

时间:2011-07-27 20:23:48

标签: c# filesystemwatcher

我正在使用FileSystemWatcher监视目录中是否有新文件夹创建。这可以正常工作,除了这些文件夹中的每一个都可以在其中包含一个或多个子目录。

问题在于,当我复制顶级文件夹(其中包含一个或多个子目录)时,FileSystemWatcher只捕获顶级文件夹而不是子目录。

例如:将子目录“bar”的文件夹'foo'拖到正在观看的目录中 FileSystemWatcher通知新目录'foo'已创建,但没有说'bar'

我是否遗漏了具有FileSystemWatcher功能的内容,还是有其他方法可以解决这个问题?

5 个答案:

答案 0 :(得分:7)

您还需要处理OnRenamed以及IncludeSubdirectories

来自MSDN

  

复制和移动文件夹

     

操作系统和FileSystemWatcher对象解释a   剪切和粘贴操作或移动操作作为文件夹的重命名操作   及其内容。如果您将包含文件的文件夹剪切并粘贴到   正在监视的文件夹,FileSystemWatcher对象仅报告   文件夹是新的,但不是它的内容,因为它们基本上只是   重命名。

     

通知已移动或复制文件夹的内容   进入一个监视文件夹,提供OnChanged和OnRenamed事件处理程序   方法...

答案 1 :(得分:3)

设置IncludeSubdirectories在这种特定情况下不起作用。

以下是我设置的示例:

        static void Main(string[] args)
        {
            FileSystemWatcher fsw = new FileSystemWatcher(@"C:\Temp", "*.*");

            fsw.EnableRaisingEvents = true;

            fsw.Created += new FileSystemEventHandler(fsw_Created);
            fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
            fsw.Changed += new FileSystemEventHandler(fsw_Changed);

            fsw.IncludeSubdirectories = true;

            Console.ReadLine();
        }

        static void fsw_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was changed.", e.FullPath);
        }

        static void fsw_Renamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine("{0} was renamed.", e.FullPath);
        }

        static void fsw_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} was created", e.FullPath);
        }

在这种情况下,如果我将包含bar文件夹的foo移动到C:\ Temp中,我只会收到C:\ Temp \ Foo创建的通知。

FileSystemWatcher没有密封,如果这个功能至关重要,我会将其子类化并扩展它以检查创建的文件夹,并为它们引发事件(或类似于此实现的东西)。

答案 2 :(得分:0)

您需要设置IncludeSudirectories,它将获取或设置一个值是否会监控子目录。

答案 3 :(得分:0)

您需要设置IncludeSubdirectories属性。

看看这个link

“如果要监视指定目录中包含的文件和目录的更改通知,请将IncludeSubdirectories设置为true”

watcher.IncludeSubdirectories = true;

答案 4 :(得分:0)

据我所知,没有办法告诉FileSystemWatcher通知您目录中已更改的每个元素。 如果修改的元素是一个目录,你必须自己进行浏览(这不是非常困难)。

IncludeSubdirectories只会告诉您有关被观看元素中文件和文件夹的修改 - 但是如果它已经被一次移动复制了。在您的示例中,当您观看 foo 并且某人将文件添加到 bar (稍后)并且您已设置IncludeSubdirectories时,您将收到有关此更改的通知。

HTH

马里奥