如何在 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"

如何在 C# 中找到父目录

您可以使用

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或资源管理器中向路径添加任意数量的'..,它的行为将与我在下面描述的完全一样。

一些基本的..行为:

  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:'

要获取"祖父"目录,请调用 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; 

您可能想查看DirectoryInfoParent财产。

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文件位于何处,这都是一致的。您不应尝试访问假定位于向后相对位置的文件

我建议您将要访问的任何资源移动到本地位置。系统目录(如应用程序数据(

相关文章:
  • 没有找到相关文章