FileSystemWatcher文件位于子目录中

时间:2013-04-30 13:50:36

标签: c# filesystemwatcher

如果文件被创建,复制或移动到我正在观看的目录中,我正在尝试收到通知。 我只想通知文件,而不是目录。

以下是我目前的一些代码:

_watcher.NotifyFilter = NotifyFilters.FileName;
_watcher.Created += new FileSystemEventHandler(file_created);
_watcher.Changed += new FileSystemEventHandler(file_created);
_watcher.Renamed += new RenamedEventHandler(file_created);
_watcher.IncludeSubdirectories = true;
_watcher.EnableRaisingEvents = true;

问题是,如果我移动一个包含文件的目录,我就不会收到该文件的事件。

如何通知我所有添加的文件(无论如何)到监视目录或子目录中?

Incase我的解释不够好......我有 WatchedDirectory Directory1 Directory1 包含 Hello.txt 。如果我将 Directory1 移动到 WatchedDirectory ,我希望收到 Hello.txt 的通知。

编辑:我应该注意我的操作系统是Windows 8.我会收到复制/粘贴事件的通知,但不会移动事件(拖放到文件夹中)。

3 个答案:

答案 0 :(得分:3)

也许这种解决方法可以派上用场(但我会小心性能,因为它涉及递归):

private static void file_created(object sender, FileSystemEventArgs e)
{
    if (e.ChangeType == WatcherChangeTypes.Created)
    {
        if (Directory.Exists(e.FullPath))
        {
            foreach (string file in Directory.GetFiles(e.FullPath))
            {
                var eventArgs = new FileSystemEventArgs(
                    WatcherChangeTypes.Created,
                    Path.GetDirectoryName(file),
                    Path.GetFileName(file));
                file_created(sender, eventArgs);
            }
        }
        else
        {
            Console.WriteLine("{0} created.",e.FullPath);
        }
    }
}

答案 1 :(得分:3)

NotifyFilters添加更多过滤器。目前你只是在观察文件名的变化。这与您的Changed和Renamed处理程序一起应该可以完成这项工作。

_watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite

这似乎仅适用于复制/粘贴操作。对于剪切/粘贴操作(或拖放),还要添加以下通知过滤器:NotifyFilters.DirectoryName

修改

我已经玩了很多,实际上只有一个顶级文件夹的通知。 如果你想到它,这是有道理的。由于更改类型是创建的,因此您确定其中的所有文件和文件夹都是新的,您可以处理它们。

所以,@ AlexFilipovici的方法是唯一可行的方法,虽然我将结果(文件夹)排入队列并在工作线程(或任务,无论如何)上处理它。您不希望在FSWatcher事件处理程序中花费太多时间,特别是如果文件以高速率进入。

答案 2 :(得分:0)

复制和移动文件夹

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

参考:MSDN