如何在 C# 中找到父目录
本文关键字: | 更新日期: 2023-09-27 18:04:10
我使用此代码查找调试目录
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"
System.IO.Directory.GetParent()
来检索给定目录的父目录。
string parent = System.IO.Directory.GetParent(str_directory).FullName;
见提货清单
如果将..'..
追加到现有路径,操作系统将正确浏览祖父文件夹。
这应该可以完成这项工作:
System.IO.Path.Combine("C:''Users''Masoud''Documents''Visual Studio 2008''Projects''MyProj''MyProj''bin''Debug", @"..'..");
如果浏览该路径,则将浏览祖父目录。
编辑:此答案中涵盖的规范化仅在路径用于访问文件系统时发生,而不是在字符串本身上发生。相比之下,这个答案纯粹使用路径字符串来实现结果和规范化,根本不使用文件系统。
我发现System.IO.Path.Combine(myPath, "..")
的变体是最简单和最可靠的。如果 Northben 说的是真的,更何况,如果有尾部斜杠,GetParent
需要额外的调用。对我来说,这是不可靠的。
Path.Combine
确保您永远不会出错斜杠。
..
的行为与Windows中的其他任何地方完全相同。您可以在cmd或资源管理器中向路径添加任意数量的'..
,它的行为将与我在下面描述的完全一样。
一些基本的..
行为:
- 如果有文件名,
..
会将其砍掉:
Path.Combine(@"D:'Grandparent'Parent'Child.txt", "..")
=> D:'Grandparent'Parent'
- 如果路径是目录,则
..
将向上移动一个级别:
Path.Combine(@"D:'Grandparent'Parent'", "..")
=> D:'Grandparent'
-
..'..
遵循相同的规则,连续两次:
Path.Combine(@"D:'Grandparent'Parent'Child.txt", @"..'..")
=> D:'Grandparent'
Path.Combine(@"D:'Grandparent'Parent'", @"..'..")
=> D:'
- 这具有完全相同的效果:
Path.Combine(@"D:'Grandparent'Parent'Child.txt", "..", "..")
=> D:'Grandparent'
Path.Combine(@"D:'Grandparent'Parent'", "..", "..")
=> D:'
要获取"祖父"目录,请调用 Directory.GetParent(( 两次:
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
Directory.GetParent
可能是一个更好的答案,但为了完整起见,有一种不同的方法可以接受字符串并返回字符串:Path.GetDirectoryName
。
string parent = System.IO.Path.GetDirectoryName(str_directory);
像这样:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;
祝你好运!
没有人提供可以跨形式工作的解决方案。我知道这不是特别问的,但我在一个 linux 环境中工作,大多数解决方案(截至我发布此解决方案时(都会提供错误。
硬编码路径分隔符(以及其他内容(将在除Windows系统以外的任何系统中给出错误。
在我的原始解决方案中,我使用了:
char filesep = Path.DirectorySeparatorChar;
string datapath = $"..{filesep}..{filesep}";
但是,在看到这里的一些答案后,我将其调整为:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
您可能想查看DirectoryInfo
。Parent
财产。
IO.Path.GetFullPath(@"..'..")
如果清除"项目属性"-"生成">->"输出"路径中的"bin'Debug'
">,则可以只使用AppDomain.CurrentDomain.BaseDirectory
由于我发现的其他任何东西都无法以真正规范化的方式解决此问题,因此这是另一个答案。
请注意,类似问题的一些答案尝试使用 Uri
类型,但这在尾随斜杠与没有尾随斜杠方面也很困难。
我在此页面上的另一个答案适用于使文件系统工作的操作,但是如果我们想立即拥有解析的路径(例如出于比较原因(,而不通过文件系统,C:/Temp/..
和C:/
将被视为不同。如果不遍历文件系统,以这种方式导航并不能为我们提供规范化的、适当可比较的路径。
我们能做什么?
我们将基于以下发现构建:
Path.GetDirectoryName(path + "/") ?? ""
将可靠地为我们提供没有尾部斜杠的目录路径。
- 添加斜杠(如
string
,而不是char
(将像对待""
一样对待null
路径。 - 由于添加了斜杠,
GetDirectoryName
将避免丢弃最后一个路径组件。 -
GetDirectoryName
将规范化斜杠和导航点。 - 这包括删除任何尾部斜杠。
- 这包括通过向上导航折叠
..
。 -
GetDirectoryName
将返回null
为一条空路,我们将其合并为""
.
我们如何使用它?
首先,规范化输入路径:
dirPath = Path.GetDirectoryName(dirPath + "/") ?? ""; // To handle nulls, we append "/" rather than '/'
然后,我们可以获取父目录,我们可以多次重复此操作以进一步向上导航:
// This is reliable if path results from this or the previous operation
path = Path.GetDirectoryName(path);
请注意,我们从未接触过文件系统。路径的任何部分都不需要存在,就像我们使用DirectoryInfo
一样。
要避免尾随 '' 的问题,请按以下方式调用它:
string ParentFolder = Directory.GetParent( folder.Trim('''')).FullName;
就我而言,我使用的是.NET 6。当我使用:
public string str_directory = Environment.CurrentDirectory.ToString();
返回 C:''Projects''MyTestProject''bin''Debug'et6.0
为了达到C:''Projects''MyTestProject,我正在使用以下内容:
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent
您可以将Parent
链接到Directory.GetParent(Environment.CurrentDirectory)
,以便访问所需的目录。
最终版本:
public string str_directory = Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.ToString();
获取解决方案试试这个
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
这是最常见的方式 - 这实际上取决于您正在做什么:(为了解释,下面的示例将删除您要求的最后 10 个字符,但是,如果有一些业务规则促使您需要查找特定位置,则应使用这些规则来检索目录位置,而不是找到其他内容的位置并修改它。
// remove last 10 characters from a string
str_directory = str_directory.Substring(0,str_directory.Length-10);
你不应该尝试这样做。Environment.CurrentDirectory 为您提供了可执行文件目录的路径。无论.exe文件位于何处,这都是一致的。您不应尝试访问假定位于向后相对位置的文件
我建议您将要访问的任何资源移动到本地位置。系统目录(如应用程序数据(