从DirectoryInfo搜索父目录

时间:2019-03-14 11:26:51

标签: c# io directoryinfo

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

我知道我可以使用该目录获取父目录

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

但是这返回了直接父对象,我有什么办法可以在路径的目录层次结构中搜索特定的父对象?

编辑

我要实现的目标是说我是否有当前目录

C:/Project/Source/Dev/Database

所以我想访问目录Source 我知道我可以通过两次调用GetParent方法来达到目的,但是我认为这不是正确的方法,因为如果将来我的文件当前目录更改并且它进一步下降,该怎么办。 因此,我想要一种完全证明的方式,无论我在当前目录中的深度如何,都可以直接找到目录Source的路径,因为可以肯定的是,我将位于目录Source

类似

FindParent('Source')

4 个答案:

答案 0 :(得分:1)

您可以尝试以下操作(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

答案 1 :(得分:1)

Directory.GetCurrentDirectory() returns a string that represents the full absolute path of the current directory.

If you want to get the path of a specific parent directory, you can simply use 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;

I've used Path.DirectorySeparatorChar and Path.AltDirectorySeparatorChar as separators so that the code will work the same on each platform.

答案 2 :(得分:0)

没有您的情况的其他信息的两种可能性:

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

  2. System.IO.Path.Combine(myPath, ".."),其作用类似于cd ..

答案 3 :(得分:0)

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

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