一种选择是执行 System.IO.Directory。GetParent ()几次。有没有一种更优雅的方式,从执行程序集所在的位置向上传送几个文件夹?
我试图做的是找到一个文本文件,它位于应用程序文件夹上方的一个文件夹中。但是程序集本身在 bin 中,它是应用程序文件夹深处的几个文件夹。
你可以使用 ..\path向上一级,..\..\path从路径向上两级。
..\path
..\..\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。
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)。
Application.StartupPath
System.Windows.Forms
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
这是对我最有效的方法:
string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));
他补充说,选择“正确”的道路并不是问题所在。./’显然是这样做的,但是在那之后,给定的字符串就不可用了,因为它只会添加’。.最后。 用 Path.GetFullPath()包围它将给出绝对路径,使其可用。
Path.GetFullPath()
另一个简单的方法是这样做:
string path = @"C:\Folder1\Folder2\Folder3\Folder4"; string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));
注意 这里上升了两级,结果是: newPath = @"C:\Folder1\Folder2\";
newPath = @"C:\Folder1\Folder2\";
附加说明 Path.GetFullPath根据您的代码在 windows/mac/mobile/上运行的环境对最终结果进行规范化。
Path.GetFullPath
这个可能会有帮助
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并添加一些检查以避免异常。
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进行路径解析是可能的,但是需要多次运行相同的函数。
System.IO.Directory.GetParent
稍微简单一点的方法是威胁路径作为一个正常的字符串,拆分它的路径分隔符,取出什么是不必要的,然后重新组合字符串回来。
var upperDir = String.Join(Path.DirectorySeparatorChar, dir.Split(Path.DirectorySeparatorChar).SkipLast(2));
当然,您可以用需要跳跃的级别数量来替换 2。
2
还请注意,这个对 Path.GetFullPath的函数调用(这里的其他答案)将查询是否使用文件系统存在路径。使用基本字符串操作不需要任何文件系统操作。