如何向上浏览几个文件夹?


115

一种选择是做几次System.IO.Directory.GetParent()。有没有更优雅的方式从执行程序所在的位置向上移动几个文件夹?

我想要做的是找到一个文本文件,该文件位于应用程序文件夹上方的一个文件夹中。但是程序集本身位于容器中,该容器位于应用程序文件夹的深处。


2
通常,相对路径会执行“ .. \ .. \ .. \ .. \ Downfolder”之类的技巧,但这取决于您到底要为...做什么?
DiskJunky

总是这样吗?
CR41G14 2013年

4
“导航”怎么样?您的意思是当前目录吗?如果是这样,您应该可以Directory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie 2013年

Answers:


211

其他简单的方法是执行此操作:

string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));

注意这将上升两个级别。结果将是: newPath = @"C:\Folder1\Folder2\";


18
Path.Combine无论如何,手动添加反斜杠都没有用。考虑Path.Combine(path, "..", "..")改为使用。
AXMIM

32

如果c:\ folder1 \ folder2 \ folder3 \ bin是路径,则以下代码将返回bin文件夹的路径基本文件夹

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

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

即,c:\ folder1 \ folder2 \ folder3

如果您需要folder2路径,则可以通过以下方式获取目录

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

那么您将获得路径为c:\ folder1 \ folder2 \



6

这是最适合我的方法:

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));

获取“正确的”路径不是问题,添加“ ../”显然可以做到这一点,但是在那之后,给定的字符串将不可用,因为它只会在末尾添加“ ../”。围绕它Path.GetFullPath()会给您绝对的路径,使其可用。


4

以下方法搜索以应用程序启动路径(* .exe文件夹)开头的文件。如果在该位置找不到文件,则搜索父文件夹,直到找到该文件或到达根文件夹为止。null如果找不到该文件,则返回。

public static FileInfo FindApplicationFile(string fileName)
{
    string startPath = Path.Combine(Application.StartupPath, fileName);
    FileInfo file = new FileInfo(startPath);
    while (!file.Exists) {
        if (file.Directory.Parent == null) {
            return null;
        }
        DirectoryInfo parentDir = file.Directory.Parent;
        file = new FileInfo(Path.Combine(parentDir.FullName, file.Name));
    }
    return file;
}

注意:Application.StartupPath通常在WinForms应用程序中使用,但在控制台应用程序中也可以使用;但是,您将必须设置对System.Windows.Forms程序集的引用。如果愿意,可以替换Application.StartupPath
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)


4

如果要声明级别数并将其放入函数中,也许可以使用函数?

private String GetParents(Int32 noOfLevels, String currentpath)
{
     String path = "";
     for(int i=0; i< noOfLevels; i++)
     {
         path += @"..\";
     }
     path += currentpath;
     return path;
}

您可以这样称呼它:

String path = this.GetParents(4, currentpath);

2

C#

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));

1

这可能会有所帮助

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}

1

我有一些虚拟目录,不能使用目录方法。因此,我为感兴趣的人制作了一个简单的split / join函数。虽然不那么安全。

var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());

因此,如果要向上移动4,则只需将更1改为4并添加一些检查以避免异常。


0

如果知道要导航到的文件夹,请找到该文件夹​​的索引,然后找到子字符串。

            var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);

2
很多情况下这都失败了。a例如,如果文件夹的名称为just ,该怎么办?如果路径看起来像这样C:\Folderame3\Folderame2\Folderame\...怎么办?
41686d6564

如果文件夹名称只是搜索“ \\ a \\”或“ \\ a”(如果最后一个)
Taran
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.