【问题标题】:Search parent directory from DirectoryInfo从 DirectoryInfo 中搜索父目录
【发布时间】:2019-03-14 11:26:50
【问题描述】:

有没有办法搜索特定的父目录?

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

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

但这会返回直接父级,有什么方法可以在路径的目录层次结构中搜索特定的父级?

编辑

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

C:/Project/Source/Dev/Database

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

类似

FindParent('Source')

【问题讨论】:

  • 你能添加一个你正在尝试做的例子吗?
  • @stuartd - 添加了更多信息
  • FindParent 方法应该返回什么?
  • @ZoharPeled - 我正在搜索的父目录的路径
  • 我认为您必须“手动”进行操作。你可以有这个名字的倍数。例如:C:\project\source\data\source\dev\

标签: c# io directoryinfo


【解决方案1】:

Directory.GetCurrentDirectory() 返回一个字符串,表示当前目录的完整绝对路径。

如果要获取特定父目录的路径,可以直接使用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 作为分隔符,这样代码在每个平台上的工作方式都是一样的。

【讨论】:

  • @PawanNogariya 我已经更新了我的答案。 Now it does work.
  • @stuartd 更改为不区分大小写。
【解决方案2】:

你可以尝试这样的事情(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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • if (string.Equals(directory.Parent.Name, parent, StringComparison.OrdinalIgnoreCase)) 而不是 if (directory.Parent.Name == parent) 因为目录名称不区分大小写
      • @DmitryBychenko - 以不同的方式完成。谢谢:)
      猜你喜欢
      • 1970-01-01
      • 2011-11-18
      • 2013-12-24
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多