如何检查路径是OS删除后的文件或目录?

时间:2014-12-26 22:01:55

标签: c#

我正在使用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;

3 个答案:

答案 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);
   }
}