140

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

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

4

12 回答 12

259

其他简单的方法是这样做:

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

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

于 2015-06-17T21:29:16.487 回答
43

如果 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

如果你想要文件夹 2 路径,那么你可以通过

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

然后你会得到路径 c:\folder1\folder2\

于 2016-09-30T08:45:59.337 回答
13

您可以使用..\path上一层,..\..\path从路径上上两层。

你也可以使用Path类。

C# 路径类

于 2013-02-15T16:52:29.427 回答
9

这对我来说最有效:

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

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

于 2014-05-21T09:54:28.253 回答
6
public static string AppRootDirectory()
        {
            string _BaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
            return Path.GetFullPath(Path.Combine(_BaseDirectory, @"..\..\"));
        }
于 2020-11-07T07:46:52.050 回答
5

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

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);
于 2013-02-15T16:56:44.157 回答
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)

于 2014-02-11T18:26:02.113 回答
4

C#

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));
于 2020-01-28T18:17:31.650 回答
2

在静态方法中隐藏对 Directory.GetParent(path) 的循环调用是可行的方法。

乱用“..”和 Path.Combine 最终会导致与操作系统相关的错误,或者由于相对路径和绝对路径之间的混淆而导致失败。

public static class PathUtils
{
    public static string MoveUp(string path, int noOfLevels)
    {
        string parentPath = path.TrimEnd(new[] { '/', '\\' });
        for (int i=0; i< noOfLevels; i++)
        {
            parentPath = Directory.GetParent(parentPath ).ToString();
        }
        return parentPath;
    }
}
于 2021-08-23T17:34:45.983 回答
1

我有一些虚拟目录,我不能使用目录方法。所以,我为那些感兴趣的人做了一个简单的拆分/连接功能。虽然不那么安全。

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

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

于 2019-01-20T01:12:31.100 回答
1

这可能会有所帮助

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}
于 2015-07-20T12:35:23.490 回答
1

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

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

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
于 2018-05-06T19:07:56.127 回答