从 DirectoryInfo 搜索父目录

Search parent directory from DirectoryInfo

有什么方法可以搜索特定的父目录吗?

我知道我可以使用这个获取目录的父目录

Directory.GetParent(Directory.GetCurrentDirectory()).FullName

但是这个 returns 直接父级,有什么办法可以在路径的目录层次结构中搜索特定的父级吗?

编辑

我想要实现的是,如果我有这样的当前目录

C:/Project/Source/Dev/Database

所以我想访问目录 Source 我知道我可以通过两次调用 GetParent 方法来达到它,但我认为这不是正确的方法,因为如果将来我的文件当前目录发生变化并且它会进一步下降怎么办。 所以我想要一些完整的证明方法,无论我在当前目录中有多深,我都可以直接找到目录 Source 的路径,因为那肯定会在目录 Source[= 中17=]

所以像

FindParent('Source')

您可以尝试这样的操作(for 循环):

private static IEnumerable<String> ParentDirectories(string directory = null) {
  for (string dir = null == directory ? Directory.GetCurrentDirectory() : directory;
       dir != null;
       dir = Directory.GetParent(dir)?.FullName)
    yield return dir;
}

演示:

var demo = string.Join(Environment.NewLine, 
  ParentDirectories(@"C:/Project/Source/Dev/Database"));

Console.Write(demo);

结果:

C:/Project/Source/Dev/Database // initial directory
C:\Project\Source\Dev          // and its all parents
C:\Project\Source
C:\Project
C:\

如果您不想 包含 目录本身,请添加 .Skip(1):

var demo = string.Join(Environment.NewLine, 
  ParentDirectories(@"C:/Project/Source/Dev/Database").Skip(1));

最后,如果你想找出以Source结尾的父目录:

string dirName = "Source";

string myParent = ParentDirectories(@"C:/Project/Source/Dev/Database")
  .FirstOrDefault(dir => string.Equals(
     dirName,
     new DirectoryInfo(dir).Name, 
     StringComparison.OrdinalIgnoreCase));

Console.Write(myParent); 

结果:

C:\Project\Source

Directory.GetCurrentDirectory() returns 表示当前目录的完整绝对路径的字符串。

如果你想获取特定父目录的路径,你可以简单地使用substring:

var path = Directory.GetCurrentDirectory(); // Suppose C:/Project/Source/Dev/Database
var sourceDir = new string[] {Path.DirectorySeparatorChar + "Source" + Path.DirectorySeparatorChar,
                           Path.AltDirectorySeparatorChar + "Source" + Path.AltDirectorySeparatorChar};

var sourcePath = path.IndexOf(sourceDir[0], StringComparison.OrdinalIgnoreCase) > -1 ?
    path.Substring(0, path.IndexOf(sourceDir[0]) + sourceDir[0].Length) :
    path.IndexOf(sourceDir[1], StringComparison.OrdinalIgnoreCase) > -1 ? 
        path.Substring(0, path.IndexOf(sourceDir[1]) + sourceDir[1].Length) : 
        null;

我使用 Path.DirectorySeparatorCharPath.AltDirectorySeparatorChar 作为分隔符,这样代码在每个平台上的工作方式都相同。

关于您的情况没有更多信息的两种可能:

  1. DirectoryInfo.GetDirectories 会为您提供 Current 目录的所有子目录,因此您需要将当前目录切换到根目录 + 1

  2. System.IO.Path.Combine(myPath, "..") 更像是 cd ..

实际上我认为已经存在一种方法或函数,但如果我必须自己编写它,那么我编写的这个解决方案对我有用

    private static string GetParent(string directoryPath, string parent)
    {
        DirectoryInfo directory = new DirectoryInfo(directoryPath);
        while (directory.Parent!=null)
        {
            if (directory.Parent.Name.ToLower() == parent.ToLower())
            {
                return directory.Parent.FullName;
            }

            directory = directory.Parent;
        }

        return null;
    }