有没有办法通过 FSW 确定文件或目录是否已被删除?
问问题
16465 次
4 回答
43
Here's a simplified and corrected version of fletcher's solution:
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);
}
}
}
}
于 2010-07-26T18:15:08.273 回答
1
只有在同一路径中可能存在同名的文件和目录时,您的问题才有意义。例如,如果您有不带扩展名的文件名或带扩展名的目录。
bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");
如果您的目录和文件遵循通常的约定,只需检查完整路径中是否存在扩展名(文件什么的。
如果您必须处理我在开头提到的非常规问题,您可以检查该位置是否存在目录或文件。如果两者都没有,您将它们视为两者都已被删除。如果其中一个确实存在,则将另一个视为已删除。
您的询问意味着您在某处保留了文件和目录的列表,因此,对照该列表,您可以做出有关处理的决定。
我认为这种方法比使用两个文件系统观察者来区分的解决方案要好。
于 2014-04-07T09:22:00.060 回答
1
我最初临时使用“路径”功能,但后来在不删除的情况下我通过 Directory.Exists 修复它。但是,这并不能解决删除案例
bool isDirectory = Path.GetExtension(e.FullPath) == string.Empty;
if (e.ChangeType != WatcherChangeTypes.Deleted)
{
isDirectory = Directory.Exists(e.FullPath);
}
于 2014-03-26T02:53:12.533 回答
-1
您可以询问该FileSystemEventArgs.FullPath
属性以判断它是目录还是文件。
if (Path.GetFileName(e.FullPath) == String.Empty)
{
//it's a directory.
}
检查它是文件还是目录。
于 2010-07-26T16:09:10.527 回答