【问题标题】:How to check a path is a file or directory after it's deleted by OS? [duplicate]操作系统删除路径后如何检查路径是文件还是目录? [复制]
【发布时间】:2014-12-27 17:39:40
【问题描述】:

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

【问题讨论】:

  • 文件夹或文件在您收到事件时已被删除。您可以做的是在内部保留所有文件和文件夹的列表,并将从您的事件收到的路径与该列表匹配
  • 如果是文件,基本目录还会存在吗?
  • @Saruman,如果它是一个目录,那么基本目录仍然存在。

标签: c#


【解决方案1】:

我猜你不能可靠地做到这一点。

文件和目录的路径可能不明确:目录可以有“扩展名”,而文件可以完全没有扩展名。

如果一个文件或目录存在,操作系统就知道它是什么。当它消失时,没有人知道了。

删除前要记住是文件还是目录,而不是事后去判断。

【讨论】:

  • 你是对的,只需查看一个字符串就可以知道,但我希望有一个操作系统级别的命令可以用于此目的,因为删除几乎从不真正删除任何内容。否则,数据恢复公司将倒闭。我试过stackoverflow.com/a/1395251/310767,但它给了我错误的结果。
  • 您必须搜索 ntfs 磁盘格式才能找到它。如果您可以提前检索它,似乎需要做很多工作。
  • 对于操作系统而言,路径已经没有了,所以删除后没有可用的信息。
  • @cod:我完全同意你的看法。实际上,对于软删除,文件被移动到某个系统目录。所以原始路径应该保存在某个地方,不确定是否可以访问。
  • @Ray:为什么没有两个观察者?一个用于文件,一个用于目录...
【解决方案2】:

您可以在开始观看之前将文件和目录存储到单独的集合中。然后,每当删除某些内容时,只需检查哪个集合包含已删除的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
    }
}

【讨论】:

    【解决方案3】:

    如果您有具有扩展名的文件和没有扩展名的目录。我会建议使用以下简单的解决方案

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

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 2012-01-15
      • 2013-03-15
      • 1970-01-01
      • 2011-12-26
      • 2013-08-14
      • 2015-07-30
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多