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

Mas*_*ian 67 c# filesystems directory

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

public string str_directory = Environment.CurrentDirectory.ToString();
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 108

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

  • 如果目录有尾部斜杠,则必须两次调用GetParent (19认同)
  • 您可以通过使用`DirectoryInfo.Parent`来避免尾部斜杠问题.例如`new System.IO.DirectoryInfo("c:/ path/to/somewhere //").Parent`.@northben (7认同)
  • 这似乎适用于相对路径(惊喜),但随后您无法获得结果(不幸的惊喜)。 (3认同)

bil*_*nkc 43

string parent = System.IO.Directory.GetParent(str_directory).FullName;
Run Code Online (Sandbox Code Playgroud)

BOL


Pie*_*ant 28

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

那应该做的工作:

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

如果浏览该路径,则将浏览grand-parent目录.

  • "Path.Combine"的结果可以通过"Path.GetFullPath"传递以清除它.那就是去"C:\ Users\Masoud\Documents\Visual Studio 2008\Projects\MyProj\MyProj" (3认同)

Tim*_*imo 14

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

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

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

一些基本..行为:

  1. 如果有文件名,..则将其关闭:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..") => D:\Grandparent\Parent\

  1. 如果路径是目录,..则会向上移动一个级别:

Path.Combine(@"D:\Grandparent\Parent\", "..") => D:\Grandparent\

  1. ..\.. 遵循相同的规则,连续两次:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..")=> D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", @"..\..")=>D:\

  1. 这具有完全相同的效果:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..")=> D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", "..", "..")=>D:\

  • 这不起作用,无论是.NET 4.7还是.NET Core 2.1:`Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")` = `D:\Grandparent\父\子.txt\..` (3认同)
  • 两年后,我发现自己又回到了这里。请注意,Path.GetFullPath(() 通常返回一个没有任何尾部反斜杠的路径,但是当您到达根目录时,例如“E:\”,就会有一个反斜杠。 (2认同)

Jay*_*ggs 11

要获取"祖父母"目录,请两次调用Directory.GetParent():

var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
Run Code Online (Sandbox Code Playgroud)


Mic*_*mes 6

像这样:

System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;
Run Code Online (Sandbox Code Playgroud)

祝好运!


Car*_*lsh 6

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

string parent = System.IO.Path.GetDirectoryName(str_directory);
Run Code Online (Sandbox Code Playgroud)

  • 冒着重复其他人已经提到过的事情的风险 - 请记住 Directory.GetParent() 实际上访问文件系统,Path.GetDirectoryName() 只是字符串操作。 (3认同)

rav*_*uya 5

您可能想查看DirectoryInfo. Parent财产。


Mad*_*vad 5

没有人提供一种可以跨表单工作的解决方案。我知道这不是特别要求,但我在 linux 环境中工作,在该环境中,大多数解决方案(在我发布此内容时)都会提供错误。

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

在我原来的解决方案中,我使用了:

char filesep = Path.DirectorySeparatorChar;
string datapath = $"..{filesep}..{filesep}";
Run Code Online (Sandbox Code Playgroud)

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

string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName; 
Run Code Online (Sandbox Code Playgroud)