我正在使用FileSystemWatcher监视目录中是否有新文件夹创建。这可以正常工作,除了这些文件夹中的每一个都可以在其中包含一个或多个子目录。
问题在于,当我复制顶级文件夹(其中包含一个或多个子目录)时,FileSystemWatcher只捕获顶级文件夹而不是子目录。
例如:将子目录“bar”的文件夹'foo'拖到正在观看的目录中 FileSystemWatcher通知新目录'foo'已创建,但没有说'bar'
我是否遗漏了具有FileSystemWatcher功能的内容,还是有其他方法可以解决这个问题?
答案 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
马里奥