如何在Windows应用程序中将相对路径转换为绝对路径?
我知道我们可以在ASP.NET中使用server.MapPath()。但是我们可以在Windows应用程序中做些什么呢?
我的意思是,如果有一个.NET内置函数可以处理...
答案 0 :(得分:158)
你试过了吗?
string absolute = Path.GetFullPath(relative);
?请注意,这将使用进程的当前工作目录,而不是包含可执行文件的目录。如果这没有帮助,请澄清您的问题。
答案 1 :(得分:17)
如果您想获得相对于.exe的路径,请使用
string absolute = Path.Combine(Application.ExecutablePath, relative);
答案 2 :(得分:13)
这个适用于不同驱动器上的路径,驱动器相对路径和实际相对路径。哎呀,如果basePath
实际上并不是绝对的话,它甚至会起作用;它总是使用当前工作目录作为最终回退。
public static String GetAbsolutePath(String path)
{
return GetAbsolutePath(null, path);
}
public static String GetAbsolutePath(String basePath, String path)
{
if (path == null)
return null;
if (basePath == null)
basePath = Path.GetFullPath("."); // quick way of getting current working directory
else
basePath = GetAbsolutePath(null, basePath); // to be REALLY sure ;)
String finalPath;
// specific for windows paths starting on \ - they need the drive added to them.
// I constructed this piece like this for possible Mono support.
if (!Path.IsPathRooted(path) || "\\".Equals(Path.GetPathRoot(path)))
{
if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
finalPath = Path.Combine(Path.GetPathRoot(basePath), path.TrimStart(Path.DirectorySeparatorChar));
else
finalPath = Path.Combine(basePath, path);
}
else
finalPath = path;
// resolves any internal "..\" to get the true full path.
return Path.GetFullPath(finalPath);
}
答案 3 :(得分:1)
这是一个较旧的主题,但它可能对某人有用。 我已经解决了类似的问题,但在我的情况下,路径不在文本的开头。
所以这是我的解决方案:
public static class StringExtension
{
private const string parentSymbol = "..\\";
private const string absoluteSymbol = ".\\";
public static String AbsolutePath(this string relativePath)
{
string replacePath = AppDomain.CurrentDomain.BaseDirectory;
int parentStart = relativePath.IndexOf(parentSymbol);
int absoluteStart = relativePath.IndexOf(absoluteSymbol);
if (parentStart >= 0)
{
int parentLength = 0;
while (relativePath.Substring(parentStart + parentLength).Contains(parentSymbol))
{
replacePath = new DirectoryInfo(replacePath).Parent.FullName;
parentLength = parentLength + parentSymbol.Length;
};
relativePath = relativePath.Replace(relativePath.Substring(parentStart, parentLength), string.Format("{0}\\", replacePath));
}
else if (absoluteStart >= 0)
{
relativePath = relativePath.Replace(".\\", replacePath);
}
return relativePath;
}
}
示例:
Data Source=.\Data\Data.sdf;Persist Security Info=False;
Data Source=..\..\bin\Debug\Data\Data.sdf;Persist Security Info=False;