2010-11-20 110 views
3

我已经设法使用FileSystemWatcher查看文件和文件夹更改。C#文件/文件夹监视器

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

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

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

FileSystemEventArgs e 

我只是想知道,如果改变的项目是一个文件或文件夹。

回答

1

我已经找到了解决方案,它是干净的并始终有效:

观察者的标准设置用于文件和文件夹。这在我看来是没有意义的,因为我找不到变化对象具有哪种类型。

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

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

唯一的问题是FSW使用ThreadPool,所以如果你使用多个观察者,那么你将处理的事件的顺序可能不会反映现实。到目前为止我发现的唯一解决方案是使用ho1提到的Change Journals,或者使用[this]编写自己的FileSystemWatcher(http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychangesw.html )和[this](http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychangesw_19.html)。只要将它扔到那里,任何人谁将来会通过这个线程。 – Paya 2012-09-23 00:49:55

1

你可以测试它是否有目录attribute

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

当然,如果它已经被删除,这是不行的,你将无法告诉的类型。

+0

您确定在OP会突出显示文件/目录被删除的位置的情况下可以使用吗? – 2010-11-20 21:13:29

+0

不,如果它已被删除,这将不起作用。 – 2010-11-20 21:14:18

+0

如果目录/文件已被删除,则失败。 – jason 2010-11-20 21:15:15

0

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

+0

??? ...因此,如果我有一个文件= C:\名称和一个文件夹= C:\名称,我找不到哪个更改? – fpdragon 2010-11-20 21:33:29

+1

您不能在同一个文件夹中拥有同名的文件和目录。 – ThiefMaster 2010-11-20 21:39:58

+0

无论如何,如果它已经被删除,你甚至不能找出它是否是一个文件或目录 – fpdragon 2010-11-20 21:46:49