C#文件/文件夹监视器

时间:2010-11-20 21:05:45

标签: c# monitor filesystemwatcher

我已经设法使用FileSystemWatcher查看文件和文件夹的更改。

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

对于删除事件,我甚至不能使用脏的workarround来测试File.Exists(路径)或Directory.Exists(路径),因为在调用方法时文件/文件夹已被删除。

也许这个对象有我需要的信息,但我没有找到它:

FileSystemEventArgs e

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

4 个答案:

答案 0 :(得分:2)

假设它在NTFS卷上,我认为你可以通过查看Change Journals来做你需要的。特别是FSCTL_READ_USN_JOURNAL控制代码并查看FileAttributesUSN_RECORD,看看它是FILE_ATTRIBUTE_DIRECTORY

你可以在这里找到一个示例(用C ++编写,但可能转换为C#,或者只是编写一个小的C ++ dll来从你的应用程序调用):Walking a Buffer of Change Journal Records

答案 1 :(得分:1)

您可以测试它是否包含目录 attribute

var attributes = File.GetAttributes(@"c:\somepath");
if ((attributes & FileAttributes.Directory) == FileAttributes.Directory)
{
    // it's a directory
}
else
{
    // it's a file
}

当然,如果它已被删除,这将无效,您将无法告诉该类型。

答案 2 :(得分:1)

我找到了一个干净且始终有效的解决方案:

观察程序的标准设置适用于文件和文件夹。这在我的眼里毫无意义,因为我无法找出更改过的对象的类型。

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

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

答案 3 :(得分:0)

除非您在查找已删除项目的最后一种类型之前有路径>类型映射列表,否则无法检索已删除项目的类型。