如何浏览几个文件夹?

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

我试图做的是找到一个文本文件,它位于应用程序文件夹上方的一个文件夹中。但是程序集本身在 bin 中,它是应用程序文件夹深处的几个文件夹。

184259 次浏览

你可以使用 ..\path向上一级,..\..\path从路径向上两级。

你也可以使用 Path类。

C # 路径类

也许你可以使用一个函数,如果你想声明的级数,并把它放入一个函数?

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);

以下方法搜索以应用程序启动路径(* 开头的文件。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)

这是对我最有效的方法:

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

他补充说,选择“正确”的道路并不是问题所在。./’显然是这样做的,但是在那之后,给定的字符串就不可用了,因为它只会添加’。.最后。 用 Path.GetFullPath()包围它将给出绝对路径,使其可用。

另一个简单的方法是这样做:

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

注意 这里上升了两级,结果是: newPath = @"C:\Folder1\Folder2\";

附加说明 Path.GetFullPath根据您的代码在 windows/mac/mobile/上运行的环境对最终结果进行规范化。

这个可能会有帮助

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

如果 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的路径

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

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


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

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

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

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

C #

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));
public static string AppRootDirectory()
{
string _BaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
return Path.GetFullPath(Path.Combine(_BaseDirectory, @"..\..\"));
}

在静态方法中隐藏对 Directory 的循环调用。

胡闹”。和路径。组合将最终导致与操作系统相关的 bug,或者由于相对路径和绝对路径之间的混合而导致失败。

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;
}
}

通过 System.IO.Directory.GetParent进行路径解析是可能的,但是需要多次运行相同的函数。

稍微简单一点的方法是威胁路径作为一个正常的字符串,拆分它的路径分隔符,取出什么是不必要的,然后重新组合字符串回来。

var upperDir = String.Join(Path.DirectorySeparatorChar, dir.Split(Path.DirectorySeparatorChar).SkipLast(2));

当然,您可以用需要跳跃的级别数量来替换 2

还请注意,这个对 Path.GetFullPath的函数调用(这里的其他答案)将查询是否使用文件系统存在路径。使用基本字符串操作不需要任何文件系统操作。