【问题标题】:C# .NET - Is a deleted path a directory or fileC# .NET - 删除的路径是目录还是文件
【发布时间】:2009-09-05 09:51:33
【问题描述】:

如何使用 C# .Net 识别 已删除 路径是文件还是目录?

谢谢

【问题讨论】:

  • 不能使用 Exist()。文件或目录已删除..但必须检查删除的路径是文件或目录路径。
  • 如果文件/目录不存在,则真的没有办法知道该路径指向什么。 Wael Dalloul 的答案是当时最好的答案,但只有当您知道目录路径总是以目录分隔符结尾时它才会起作用。
  • 因为我的回答在技术上是正确的,所以要更新您的问题
  • 您是否使用 FileWatcher 类来检测被删除的内容?

标签: c# file-io


【解决方案1】:

假设文件/目录确实存在,可以使用两种静态方法:

两者都接受一个字符串参数,如果文件/目录存在则返回一个布尔值。

另一种情况是,当您的路径不引用文件系统中的现有文件/目录时 - 也许它指向数据库中的某种“虚拟文件/目录”,或路径指向曾经存在但现在(可能)被删除的文件/目录。在这种情况下,您必须自己定义“类文件路径”和“类目录路径”的区别。我可以想到两种方法:

  • 答:目录路径以目录分隔符结尾(Wael Dalloul 建议)
  • B:文件路径的最后一个路径标记中有一个扩展分隔符

让我们在几个示例输入字符串上测试这两种方法:

  • c:\windows\ 在这两种情况下都是一个目录
  • c:\windows 仅在使用方法 B 时是一个目录
  • c:\windows\notepad.exe 在这两种情况下都是一个文件
  • c:\windows\system32\drivers\etc\hosts 是仅在方法 A 中的文件

正如这些示例所指出的,这两种方法都不能保证在所有情况下都能给出预期的答案,除非您能够从一开始就准确控制路径的设计方式。

【讨论】:

  • 我只有一个字符串。它是目录还是文件?不能使用 Exist()
  • @Ashish:我的回答中提到的两种静态方法都只使用一个字符串作为参数。
【解决方案2】:

如果您在文件上使用 Directory.Exists(...),它将返回 false。 同样,如果您在目录上使用 File.Exists(...) ,它将返回 false

【讨论】:

    【解决方案3】:

    你也可以使用: path.GetFileName

    如果path的最后一个字符是目录或者卷分隔符,这个方法返回Empty,所以你可以检查结果是否为空所以它是一个目录,否则它是一个文件。

    【讨论】:

    • 也许吧。在这种解释中,字符串“c:\windows”是一个文件,但是当我在开始> 运行对话框中键入它时,我会看到一个显示Windows 目录 的资源管理器窗口。
    【解决方案4】:
    if (Path.HasExtension(fileFolderPath) && !string.IsNullOrEmpty(Path.GetFileName(fileFolderPath)))
    {
        //path is for file
    }
    

    Directory.Exists 和 File.Exists 在路径不存在时不是选项。

    【讨论】:

      【解决方案5】:

      如果您有扩展名,那么您可以猜测它是一个文件,但这只是猜测,因为您始终可以将文件夹命名为“myfile.txt”。前面提到的另一个猜测是它是否以路径分隔符结尾。

      File.Exists 和 Directory.Exists 都使用 GetFileAttributesEx 来查看文件的属性,但由于它不再存在,因此您没有该选项。如果它在回收站中,您也许可以在那里找到它 - this question 有详细信息。

      【讨论】:

      • 既然已经有了 File.Exists 做同样的事情,为什么还要用 IsFile 方法扩展 Path 类?
      • 哇,答案与第一名完全相同,但 -2。我会更新已删除的路径
      • @Mikael File.Exists 告诉你文件是否存在而不是如果它是一个目录,但你是对的,它最终是同一件事,但语义价值略低
      • 但正如我所说,路径是静态的,所以这不是一个选项。如果是我更喜欢 Path path = new Path(@"C:\windows"); path.IsFile() 个人。 Uri 不这样做,因为不能使用文件系统。
      【解决方案6】:

      你可以使用

      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetError = true)]
      static extern int GetFileAttributes(string lpFileName);
      
      bool IsDirectory(string path) {
           return GetFileAttributes(path) & 16 == 16;
      }
      

      但是,其他答案中建议的 Directory.Exists 和 File.Exists 也一样好。

      更多详情请见here。

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 1970-01-01
        • 2013-03-15
        • 2010-09-13
        • 2017-08-16
        • 2018-12-18
        • 1970-01-01
        • 2012-01-15
        • 2012-07-17
        相关资源
        最近更新 更多