一种选择是执行 System.IO.Directory.GetParent() 几次。有没有更优雅的方式从执行程序集所在的位置向上移动几个文件夹?
我要做的是找到一个文本文件,该文件位于应用程序文件夹上方的一个文件夹中。但程序集本身位于 bin 内,即应用程序文件夹深处的几个文件夹。
一种选择是执行 System.IO.Directory.GetParent() 几次。有没有更优雅的方式从执行程序集所在的位置向上移动几个文件夹?
我要做的是找到一个文本文件,该文件位于应用程序文件夹上方的一个文件夹中。但程序集本身位于 bin 内,即应用程序文件夹深处的几个文件夹。
其他简单的方法是这样做:
string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));
注意这上升了两个级别。结果将是:
newPath = @"C:\Folder1\Folder2\";
如果 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\
这对我来说最有效:
string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));
获得“正确”路径不是问题,添加“../”显然可以做到这一点,但在那之后,给定的字符串将不可用,因为它只会在末尾添加“../”。将其包围Path.GetFullPath()
将为您提供绝对路径,使其可用。
public static string AppRootDirectory()
{
string _BaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
return Path.GetFullPath(Path.Combine(_BaseDirectory, @"..\..\"));
}
如果要声明级别数并将其放入函数中,也许可以使用函数?
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)
C#
string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));
在静态方法中隐藏对 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;
}
}
我有一些虚拟目录,我不能使用目录方法。所以,我为那些感兴趣的人做了一个简单的拆分/连接功能。虽然不那么安全。
var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());
因此,如果您想将 4 向上移动,您只需更改1
to4
并添加一些检查以避免异常。
这可能会有所帮助
string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
// file found
}
如果您知道要导航到的文件夹,请找到它的索引,然后找到子字符串。
var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");
string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);