.NET filesystemwatcher – 它是文件还是目录?

有没有办法确定FSW是否删除了文件或目录?

这是fletcher解决方案的简化和更正版本:

 namespace Watcher { class Program { private const string Directory = @"C:\Temp"; private static FileSystemWatcher _fileWatcher; private static FileSystemWatcher _dirWatcher; static void Main(string[] args) { _fileWatcher = new FileSystemWatcher(Directory); _fileWatcher.IncludeSubdirectories = true; _fileWatcher.NotifyFilter = NotifyFilters.FileName; _fileWatcher.EnableRaisingEvents = true; _fileWatcher.Deleted += WatcherActivity; _dirWatcher = new FileSystemWatcher(Directory); _dirWatcher.IncludeSubdirectories = true; _dirWatcher.NotifyFilter = NotifyFilters.DirectoryName; _dirWatcher.EnableRaisingEvents = true; _dirWatcher.Deleted += WatcherActivity; Console.ReadLine(); } static void WatcherActivity(object sender, FileSystemEventArgs e) { if(sender == _dirWatcher) { Console.WriteLine("Directory:{0}",e.FullPath); } else { Console.WriteLine("File:{0}",e.FullPath); } } } } 

我最初暂时使用“Path”函数,但稍后如果没有删除,我会通过Directory.Exists修复它。 但是,这并不能解决删除案例

 bool isDirectory = Path.GetExtension(e.FullPath) == string.Empty; if (e.ChangeType != WatcherChangeTypes.Deleted) { isDirectory = Directory.Exists(e.FullPath); } 

只有在同一路径中可能存在具有相同名称的文件和目录时,您的问题才有意义。 例如,如果您有没有扩展名的文件名或带扩展名的目录。

如果您的目录和文件遵循通常的约定,只需检查完整路径中是否存在扩展名( bool iSDirectory = Path.GetExtension(e.FullPath).Equals(""); ),无论文件/目录是否有效是否存在,因为该方法只解析给定的路径,并且与文件无关。

如果您必须处理我在开头提到的非常规问题,您可以检查该位置是否存在目录或文件。 如果两者都没有,则将它们视为两者都被删除。 如果其中一个确实存在,则将另一个视为已删除。

您的查询意味着您在某处保留了文件和目录的列表,因此,检查该列表,您可以做出有关处理的决定。

我认为这种方法比使用两个文件系统观察者以解决差异的解决方案更好。

您可以询问FileSystemEventArgs.FullPath属性以告知它是目录还是文件。

 if (Path.GetFileName(e.FullPath) == String.Empty) { //it's a directory. } 

检查它是文件还是目录。