Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#文件/文件夹监视器_C#_Monitor_Filesystemwatcher - Fatal编程技术网

C#文件/文件夹监视器

C#文件/文件夹监视器,c#,monitor,filesystemwatcher,C#,Monitor,Filesystemwatcher,我已经通过FileSystemWatcher看到了文件和文件夹的更改 我的问题是我无法区分文件和文件夹。文件和文件夹可能具有相同的路径名 对于delete事件,我甚至不能对测试文件.Exists(path)或Directory.Exists(path)使用dirty workaround,因为调用该方法时文件/文件夹已被删除 可能此对象包含我需要的信息,但我没有找到它: FileSystemEventArgs e 我只想知道更改的项目是文件还是文件夹。您可以测试它是否有目录: 当然,如果它已经

我已经通过FileSystemWatcher看到了文件和文件夹的更改

我的问题是我无法区分文件和文件夹。文件和文件夹可能具有相同的路径名

对于delete事件,我甚至不能对测试文件.Exists(path)或Directory.Exists(path)使用dirty workaround,因为调用该方法时文件/文件夹已被删除

可能此对象包含我需要的信息,但我没有找到它:

FileSystemEventArgs e

我只想知道更改的项目是文件还是文件夹。

您可以测试它是否有目录:


当然,如果它已经被删除,这将不起作用,并且您将无法识别类型。

除非您有一个路径->类型映射列表,然后才能在其中查找删除项目的最后一种类型,否则无法检索已删除项目的类型。

假设它位于NTFS卷上,我认为您可以通过看着这张照片。特别是控制代码,并查看的,以查看它是否是
文件\属性\目录


这里可以找到一个示例(C++中,但可能转换成C语言,或者可能只是编写一个小的C++ DLL来调用你的应用程序):

< P>我找到了一个干净的,总是工作的解决方案:

监视程序的标准设置用于文件和文件夹。这在我看来毫无意义,因为我无法找出更改对象的类型

可以创建两个FileWatcher。一个用于文件,一个用于文件夹。然后,您只需更改默认设置,如下所示:

// for file
fileSysWatchFile.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
// for folder
fileSysWatchDir.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.LastWrite;

你确定在OP突出显示文件/目录被删除的情况下,这会起作用吗?是的,我也是这么说的。啊,对不起。我想我们是在同一时间发布的。???。。。因此,如果我有一个file=C:\name和一个folder=C:\name,我就无法找出是哪一个被更改了?你不能在同一个文件夹中有一个同名的文件和目录。无论如何,如果它已经被删除,你甚至无法找出它是一个文件还是一个目录唯一的问题是FSW使用了线程池,因此,如果您使用多个观察者,那么您将处理的事件顺序可能无法反映现实。到目前为止,我找到的唯一解决方案是使用ho1提到的变更日志,或者使用and编写自己的文件系统监视程序。只是把它扔给将来会遇到这个问题的人。
// for file
fileSysWatchFile.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
// for folder
fileSysWatchDir.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.LastWrite;