我正在使用System.IO.FileSystemWatcher
来监控目录,并在修改或删除文件或目录时执行操作。
我遇到的问题是,一旦删除了一个文件夹,就会引发Deleted
事件,但是我得到的参数对我来说无法知道目录或文件是否被删除。
我得到的参数是一个路径,例如C:\Temp\a
,它可以是目录或没有扩展名的文件。
我尝试了以下内容,但他们都没有给我正确的结果。
var c = Path.DirectorySeparatorChar.ToString();
var isDir = Path.GetDirectoryName(path) == path.TrimEnd(c.ToCharArray());
和
var isDir =(File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory;
答案 0 :(得分:3)
我想你无法可靠地做到这一点。
文件和目录的路径可能不明确:目录可以有一个'扩展名'并且文件根本没有扩展名。
如果存在文件或目录,操作系统会知道它是什么。当它消失了,没有人知道了。
您必须记住在删除之前它是文件还是目录,而不是之后尝试确定它。
答案 1 :(得分:1)
您可以在开始观看之前将文件和目录存储到单独的集合中。然后,每当删除某些内容时,只需检查哪个集合包含已删除的path
。
例如:
var files = Directory.GetFiles("path", "*", SearchOption.AllDirectories);
var directories = Directory.GetDirectories("path","*", SearchOption.AllDirectories);
private static void OnDeleted(object source, FileSystemEventArgs e)
{
if(files.Contains(e.FullPath))
{
// it's a file
}
else
{
// it's a directory
}
}
答案 2 :(得分:1)
如果您有包含扩展名的文件和没有扩展名的目录。我建议使用以下简单的解决方案
private static void OnDeleted(object source, FileSystemEventArgs e)
{
bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");
if(iSDirectory)
{
Console.WriteLine("Directory:{0}",e.FullPath);
}
else
{
Console.WriteLine("File:{0}",e.FullPath);
}
}