我使用此代码查找调试目录
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"
答案 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或资源管理器中的路径中添加任意数量的\..
,它的行为与我在下面描述的完全相同。
一些基本的..
行为:
..
会将其删除: 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:\
答案 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)
您可能需要查看DirectoryInfo
。Parent
属性。
答案 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();