如何在C#中找到父目录?

时间:2011-07-29 16:05:35

标签: c# directory filesystems

我使用此代码查找调试目录

public string str_directory = Environment.CurrentDirectory.ToString();

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug"

如何找到如下所示的父文件夹?

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj"

15 个答案:

答案 0 :(得分:103)

您可以使用System.IO.Directory.GetParent()来检索给定目录的父目录。

答案 1 :(得分:40)

string parent = System.IO.Directory.GetParent(str_directory).FullName;

请参阅BOL

答案 2 :(得分:26)

如果将..\..附加到现有路径,操作系统将正确浏览祖父文件夹。

那应该做的工作:

System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");

如果您浏览该路径,则将浏览祖父目录。

答案 3 :(得分:14)

我发现System.IO.Path.Combine(myPath, "..")的变体是最简单,最可靠的。更重要的是,如果northben说的是真的,那么如果有一个尾随斜杠,则GetParent需要额外的调用。对我来说,这是不可靠的。

Path.Combine确保你永远不会出现斜线错误。

..的行为与Windows中的其他任何行为完全相同。您可以在cmd或资源管理器中的路径中添加任意数量的\..,它的行为与我在下面描述的完全相同。

一些基本的..行为:

  1. 如果有文件名,..会将其删除:
  2. Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..") => D:\Grandparent\Parent\

    1. 如果路径是目录,..将向上移动一级:
    2. Path.Combine(@"D:\Grandparent\Parent\", "..") => D:\Grandparent\

      1. ..\..遵循相同的规则,连续两次:
      2. Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..") => D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", @"..\..") => D:\

        1. 这具有完全相同的效果:
        2. Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..") => D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", "..", "..") => D:\

答案 4 :(得分:11)

要获取“祖父母”目录,请拨打Directory.GetParent()两次:

var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());

答案 5 :(得分:6)

像这样:

System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;
祝你好运!

答案 6 :(得分:5)

Directory.GetParent可能是一个更好的答案,但为了完整性,有一个不同的方法,它接受字符串并返回字符串:Path.GetDirectoryName

string parent = System.IO.Path.GetDirectoryName(str_directory);

答案 7 :(得分:3)

您可能需要查看DirectoryInfoParent属性。

答案 8 :(得分:2)

由于我没有发现其他方法可以真正地标准化解决此问题,因此这是另一个答案。

请注意,一些类似问题的答案都尝试使用Uri类型,但是在结尾斜杠与没有结尾斜杠之间都比较困难。

我在此页面上的other answer适用于使文件系统正常工作的操作,但是如果我们现在想拥有已解析的路径(例如出于比较的原因),而无需遍历文件系统,{ {1}}和C:/Temp/..被认为是不同的。如果不浏览文件系统,以这种方式导航将无法为我们提供标准化的,可比较的路径。

我们能做什么?

我们将基于以下发现:

C:/可靠地为我们提供目录路径,且不带斜杠

  • 添加斜杠(以Path.GetDirectoryName(path + "/") ?? ""表示,而不以string表示 )将char路径视为与对待null相同。 / li>
  • ""将避免丢弃最后一个路径组件,这要归功于斜杠。
  • GetDirectoryName将规范斜杠和导航点。
  • 这包括删除所有后缀斜杠。
  • 这包括通过向上导航折叠GetDirectoryName
  • ..将返回GetDirectoryName的空路径,我们将其合并为null

我们如何使用它?

首先,标准化输入路径

""

然后,我们可以获取父目录,并且我们可以重复此操作任意次以进一步向上导航:

dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";

请注意,我们从未接触过文件系统。就像我们使用// This is reliable if path results from this or the previous operation path = Path.GetDirectoryName(path); 一样,路径的任何部分都不需要存在。

答案 9 :(得分:1)

你不应该试着这样做。 Environment.CurrentDirectory为您提供可执行目录的路径。无论.exe文件在哪里,这都是一致的。您不应该尝试访问假定位于向后相对位置的文件

我建议您将要访问的任何资源移动到本地位置。系统目录(例如AppData)

答案 10 :(得分:1)

这是最常见的方式 - 它实际上取决于你在做什么: (为了解释,下面的示例将删除您要求的最后10个字符,但是如果有一些业务规则需要您查找特定位置,则应使用这些字符来检索目录位置,而不是找到别的位置并修改它。)

// remove last 10 characters from a string
str_directory = str_directory.Substring(0,str_directory.Length-10);

答案 11 :(得分:1)

为避免尾随\的问题,请按以下方式调用:

  string ParentFolder =  Directory.GetParent( folder.Trim('\\')).FullName;

答案 12 :(得分:1)

没有人提供过交叉形式的解决方案。我知道它没有被特别要求,但我在linux环境中工作,大多数解决方案(如我发布时)会提供错误。

硬编码路径分隔符(以及其他内容)将在除Windows系统之外的任何内容中出错。

在我使用的原始解决方案中:

char filesep = Path.DirectorySeparatorChar;
string datapath = $"..{filesep}..{filesep}";

然而,在看到这里的一些答案后,我将其调整为:

string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName; 

答案 13 :(得分:0)

IO.Path.GetFullPath(@"..\..")

如果您清除" bin\Debug\"在项目属性中 - >构建 - >输出路径,然后您可以使用AppDomain.CurrentDomain.BaseDirectory

答案 14 :(得分:0)

获得解决方案 试试这个

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();