【问题标题】:FileSystemWatcher event on adding a folder with subdirectories添加带有子目录的文件夹时的 FileSystemWatcher 事件
【发布时间】:2011-07-27 20:23:48
【问题描述】:

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

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

例如: 将文件夹 'foo' 和子目录 'bar' 拖到被监视的目录中 FileSystemWatcher 通知新目录“foo”已创建,但没有提及“bar”

我是否遗漏了 FileSystemWatcher 的功能或有其他解决方法?

【问题讨论】:

    标签: c# filesystemwatcher


    【解决方案1】:

    您还需要处理OnRenamed,以及IncludeSubdirectories

    来自MSDN

    复制和移动文件夹

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

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

    【讨论】:

      【解决方案2】:

      在这种特定情况下,设置 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 不是密封的,如果这个功能很重要,我会将它子类化并扩展它以检查创建的文件夹,并为它们引发事件(或类似于此实现的东西)。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您需要设置IncludeSubdirectories 属性。

          看看这个link

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

          watcher.IncludeSubdirectories = true;
          

          【讨论】:

            【解决方案5】:

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

            IncludeSubdirectories 仅告诉您有关被监视元素中文件和文件夹的修改 - 但遗憾的是,如果它已被一次性复制,则不会。在您的示例中,当您观看 foo 并且有人将文件添加到 bar (稍后)并且您已设置 IncludeSubdirectories 您将收到该更改的通知。

            马里奥

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-05-13
              • 1970-01-01
              • 2019-08-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-10
              • 1970-01-01
              • 2014-04-08
              相关资源
              最近更新 更多