【问题标题】:FileSystemWatcher files in subdirectory子目录中的 FileSystemWatcher 文件
【发布时间】:2013-04-30 13:50:35
【问题描述】:

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

这是我目前拥有的一些代码:

_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;

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

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

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

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

【问题讨论】:

标签: c# filesystemwatcher


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    编辑

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

    所以,@AlexFilipovici 的方法是唯一可行的方法,尽管我会将结果(文件夹)排入队列并在工作线程(或任务,等等)上处理它。您不希望在 FSWatcher 事件处理程序中花费太多时间,尤其是在文件以高速率传入的情况下。

    【讨论】:

    • 我试过了,但我仍然没有收到移动事件的通知。
    • @Josh:更新了答案。还在 Win 8 上进行了测试,效果很好。
    • NotifyFilters.DirectoryName 过滤器会为目录触发一个事件,但不会触发内容(我试图获得通知的内容)。
    【解决方案3】:

    复制和移动文件夹

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

    参考:MSDN

    【讨论】:

    • 但是我已经设置了 IncludeSubdirectories 属性,并且我正在监视重命名的事件。仍然没有事件弹出。
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多