使用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);
}
}
}
}
FileSystemWatcher
实例在不同线程上运行。因此,如果监视的目录中有很多事件,你在应用程序中看到的事件顺序可能会有所不同 - 例如,你可能会记录到在一个尚不存在的目录中创建了文件,随后是创建该目录的事件。 - Paya我最初使用了“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.
}
检查它是文件还是目录。
File.GetAttributes
方法对于已删除的文件会抛出 FileNotFoundException
异常。 - Phil Gane.FullPath
包含“C:\abc\def”。请注意缺少任何尾随反斜杠。 - Steven Sudit
NotifyFilter
值不同时,这可能会起作用。 - Steven Sudit