C# 即使IncludeSubDirectory设置为false,FileSystemWatcher也会获取子目录事件

C# 即使IncludeSubDirectory设置为false,FileSystemWatcher也会获取子目录事件,c#,windows-services,filesystemwatcher,C#,Windows Services,Filesystemwatcher,我在windows服务中安装了以下FileSystemWatcher FileSystemWatcher Watcher = new FileSystemWatcher(); Watcher.Path = watcherDir; Watcher.NotifyFilter = NotifyFilters.LastWrite; Watcher.Renamed += Watcher_Renamed; Watcher.Changed += Watcher_Chan

我在windows服务中安装了以下FileSystemWatcher

    FileSystemWatcher Watcher = new FileSystemWatcher();
    Watcher.Path = watcherDir;
    Watcher.NotifyFilter = NotifyFilters.LastWrite;
    Watcher.Renamed += Watcher_Renamed;
    Watcher.Changed += Watcher_Changed;
    Watcher.Error += Watcher_Error;
    Watcher.Filter = "*.*";
    Watcher.IncludeSubdirectories = false;
    Watcher.EnableRaisingEvents = true;
我看到一些不一致的行为-它也侦听子目录中的更改。我已登录以查看它发现了什么有点奇怪。
我正在观看C:\Temp\Folder1,其他一些进程在C:\Temp\Folder1\Folder2中创建一个日志文件。此FileSystemWatcher对象正在获取此信息-
1.e、 FullPath给出子目录的名称,在本例中为C:\Temp\Folder1\Folder2
2.GetDirectoryName(e.FullPath)为我提供了实际监视的目录,即C:\Temp\Folder1。
3.扩展是空的,这就是我忽略这个的原因,这就是我忽略这个案例的原因

    FileSystemWatcher Watcher = new FileSystemWatcher();
    Watcher.Path = watcherDir;
    Watcher.NotifyFilter = NotifyFilters.LastWrite;
    Watcher.Renamed += Watcher_Renamed;
    Watcher.Changed += Watcher_Changed;
    Watcher.Error += Watcher_Error;
    Watcher.Filter = "*.*";
    Watcher.IncludeSubdirectories = false;
    Watcher.EnableRaisingEvents = true;

还有什么建议可以让我知道这里发生了什么

在目录中创建或删除文件也被视为对该目录本身的更改。这就是正在向你报告的事件
Folder2本身在您监视的目录中

    FileSystemWatcher Watcher = new FileSystemWatcher();
    Watcher.Path = watcherDir;
    Watcher.NotifyFilter = NotifyFilters.LastWrite;
    Watcher.Renamed += Watcher_Renamed;
    Watcher.Changed += Watcher_Changed;
    Watcher.Error += Watcher_Error;
    Watcher.Filter = "*.*";
    Watcher.IncludeSubdirectories = false;
    Watcher.EnableRaisingEvents = true;
报告的路径是目录的路径,而不是目录中的文件,您会注意到,尽管文件系统操作实际上是创建或删除操作,但调用的却是您的
已更改的
处理程序

    FileSystemWatcher Watcher = new FileSystemWatcher();
    Watcher.Path = watcherDir;
    Watcher.NotifyFilter = NotifyFilters.LastWrite;
    Watcher.Renamed += Watcher_Renamed;
    Watcher.Changed += Watcher_Changed;
    Watcher.Error += Watcher_Error;
    Watcher.Filter = "*.*";
    Watcher.IncludeSubdirectories = false;
    Watcher.EnableRaisingEvents = true;

在事件处理程序中,您只需检查报告的路径是否正确,如果是这样,只需返回,并且在事件处理程序中不执行进一步的处理。

是的,我已经在检查,但不应该查看。IncludeSubdirectories=false;防止这种情况发生?@Kodathon-否。将目录视为特殊文件,其中包含文件列表以及在文件系统中的位置。当从目录中添加或删除一个文件时,该特殊文件本身正在被更改。它是一个特殊的文件,位于
Folder1
目录中,您正在监视的文件,您正在接收事件。当
Folder2
中的文件发生更改时,您不会收到事件。仅当文件被添加或从目录中删除时。如果该属性处理它,则更可取。无论如何,我们将进行此额外检查以验证路径。谢谢@KODASTON -考虑如果你正在使用<代码>创建的< /代码>事件。(在我看来)如果你说“我不想知道子目录中的创建事件”,这意味着你没有被告知在你监视的目录中正在创建新目录,这将是非常意外的。如果我明确指定我不想跟踪子目录中的文件,额外的通知对我来说是一项开销。除了有额外的检查外,还有缓冲区大小的问题,这是我绝对不想要的,因为我一开始并不关心子目录。
    FileSystemWatcher Watcher = new FileSystemWatcher();
    Watcher.Path = watcherDir;
    Watcher.NotifyFilter = NotifyFilters.LastWrite;
    Watcher.Renamed += Watcher_Renamed;
    Watcher.Changed += Watcher_Changed;
    Watcher.Error += Watcher_Error;
    Watcher.Filter = "*.*";
    Watcher.IncludeSubdirectories = false;
    Watcher.EnableRaisingEvents = true;