2013-09-27 155 views
1

我正在开发一个应用程序,使用NotifyFilters.FileName和NotifyFilters.DirectoryName过滤器来使用FileSystemWatcher观看文件/目录创建/删除事件。我也设置IncludeSubdirectories为真FileSystemWatcher - Windows资源管理器 - >撤消

使用此,如果我在Windows资源管理器中复制文件夹,我得到创建事件的每个子文件夹以及新文件夹本身。但是,如果我在Windows资源管理器(包含子项)中删除一个文件夹,然后“撤消”在Windows资源管理器中的操作,我只会得到该文件夹​​的创建事件,而不是任何子项。

我不能简单地做一个Directory.GetFiles()作为子项目可能不存在在那一点,我不能只调度它到以后的时间取决于文件的计数/大小,撤消操作可能需要很长时间才能完成,我不知道延迟调度需要多长时间。

我注意到,如果我也听NotifyFilters.Attributes标志,那么我确实会为撤消操作的每个子项都得到一个ResourceChanged事件,但ResourceChanged事件会在很多其他情况下引发,并且我真的在寻找一个明确的创作活动。

有什么建议吗?

回答

0

如果您在资源管理器中删除文件,该文件将被移至回收站。如果文件从回收站中恢复,您可以通过向回收站添加观察器来检测该文件。寻找回收站的路径有点棘手,但是该代码完成了这项工作:

WindowsIdentity currentUser = WindowsIdentity.GetCurrent(); 
string path = string.Format(@"C:\$Recycle.Bin\{0}", currentUser.User.Value); 
FileSystemWatcher w = new FileSystemWatcher(path, "*.*"); 
w.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Attributes | NotifyFilters.Size; 
w.IncludeSubdirectories = true; 
w.Changed += watcher_Changed; 
w.Created += watcher_Created; 
w.Renamed += watcher_Renamed; 
w.Deleted += watcher_Deleted; 
w.EnableRaisingEvents = true;