【问题标题】:Is FileInfo a descendant of DirectoryInfoFileInfo 是 DirectoryInfo 的后代吗
【发布时间】:2014-09-24 09:05:06
【问题描述】:

如何检查 FileInfo 对象是否是 DirectoryInfo 的后代?

public bool IsFileDescendantOfDirectory(
    FileInfo fileInfo,
    DirectoryInfo directoryInfo)
{

}

【问题讨论】:

    标签: c# .net fileinfo directoryinfo


    【解决方案1】:

    您可以上一级目录:

    public static bool IsFileDescendantOfDirectory(FileInfo fileInfo, DirectoryInfo directoryInfo)
    {
        // https://connect.microsoft.com/VisualStudio/feedback/details/777308/inconsistent-behavior-of-fullname-when-provided-path-ends-with-a-backslash
        string path = directoryInfo.FullName.TrimEnd(Path.DirectorySeparatorChar);
        DirectoryInfo dir = fileInfo.Directory;
        while (dir != null)
        {
            if (dir.FullName.TrimEnd(Path.DirectorySeparatorChar).Equals(path, StringComparison.OrdinalIgnoreCase))
                return true;
            dir = dir.Parent;
        }
        return false;
    }
    

    有趣的是,您必须比较 FullNameDirectoryInfo.Equals 无法按预期工作,因为它使用了 Object.Equals,它只是比较引用。

    【讨论】:

    • 比较路径检查文件路径是否以目录路径开头有什么好处?
    • @samy:目录:C:\Dir1\Subdir 文件:C:\Dir1\Subdir.txt。该文件不在目录或其父目录之一中,但 StartsWith 返回 true。我想你也可以使用字符串方法。但是你必须处理边缘情况。因此,恕我直言,上述方法更健壮且更具可读性。
    • 好收获!关于您的方法,它以IsFileDescendantOfDirectory(new FileInfo(@"C:\temp\file.txt"), new DirectoryInfo(@"c:\temp\")) 失败。知道为什么吗?
    • 好的,找到原因了,最后的\没有被DirectoryInfo FullName属性清理掉
    • @samy:你说得对,好点子。这似乎是一个仍未修复的错误:connect.microsoft.com/VisualStudio/feedback/details/777308/… 我已编辑答案以删除它们。
    【解决方案2】:

    您可以检查文件的父级,直到找到匹配的目录。这将比在目录中搜索文件更快:

    public bool IsFileDescendantOfDirectory(DirectoryInfo directoryInfo, FileInfo fileInfo)
    {
        DirectoryInfo d = fileInfo.Directory;
        do
        {
            if (d.FullName.Equals(directoryInfo.FullName, StringComparison.OrdinalIgnoreCase))
            {
                return true;
            }
    
            d = d.Parent;
        }
        while(d != null);
    
        return false;
    }
    

    【讨论】:

    • 您确定 = 操作数可以在这里工作吗?上面蒂姆的回答通过进行字符串比较来解决这个问题。
    • @divinci true,这不适用于临时创建的 DirectoryInfos
    【解决方案3】:

    在与 Tim Schmelter 反复讨论之后,我很确定以下方法可以有效地确定 FileInfo 路径是否位于 DirectoryInfo 路径下:

    public static bool IsFileBelowDirectory(FileInfo fileInfo, DirectoryInfo directoryInfo)
    {
        var separator = Path.DirectorySeparatorChar.ToString();
        var directoryPath = string.Format("{0}{1}"
        , directoryInfo.FullName
        , directoryInfo.FullName.EndsWith(separator) ? "": separator);
    
        return fileInfo.FullName.StartsWith(directoryPath, StringComparison.OrdinalIgnoreCase);
    }
    

    有趣的是,您无需遍历目录即可检查每个级别的相等性。当您的文件显然不在目录中时,这可以节省一些时间;例如,对于目录C:\this\is\a\path\that\is\long 和文件C:\this\is\a\path\that\is\also\long.txt,在目录中向上走会浪费检查,因为差异在路径的末尾。

    【讨论】:

      【解决方案4】:

      如果您想查找名称,这将是一个简单的解决方案:

      Directory
      .EnumerateFiles(di.FullName, *.*, SearchOption.AllDirectories)
      .Any(x => x == fileInfo.FullName);
      

      【讨论】:

        【解决方案5】:

        FileInfo 通过其 Directory 属性给出一个 DirectoryInfo,而 DirectoryInfo 给出一个 Parent 属性。就这样;

        DirectoryInfo fileOwner = myFileInfo.Directory;
        do
        {
           if(fileOwner == mySampleDirectory) Debug.WriteLine("Yes !");
           fileOwner = fileOwner.Parent;
        } 
        while(fileOwner != null)
        

        【讨论】:

          【解决方案6】:

          这就够了:

              public static bool IsDirectoryParent(DirectoryInfo directoryInfo, DirectoryInfo parentInfo)
              {
                  if (!directoryInfo.Name.StartsWith(parentInfo.FullName))
                      return false;
                  return directoryInfo.FullName == parentInfo.FullName 
                      || IsDirectoryParent(directoryInfo.Parent, parentInfo);
              }
          
              public bool IsFileParent(FileInfo fileInfo, DirectoryInfo directoryInfo)
              {
                  return IsDirectoryParent(fileInfo.Directory, directoryInfo);
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-17
            • 2010-11-07
            • 2010-10-14
            • 1970-01-01
            相关资源
            最近更新 更多