C# 如何在Windows应用程序中将相对路径转换为绝对路径?
如何在Windows应用程序中将相对路径转换为绝对路径 我知道我们可以在ASP.NET中使用server.MapPath()。但是在Windows应用程序中我们可以做什么呢 我的意思是,如果有一个.NET内置函数可以处理这个问题…您是否尝试过:C# 如何在Windows应用程序中将相对路径转换为绝对路径?,c#,C#,如何在Windows应用程序中将相对路径转换为绝对路径 我知道我们可以在ASP.NET中使用server.MapPath()。但是在Windows应用程序中我们可以做什么呢 我的意思是,如果有一个.NET内置函数可以处理这个问题…您是否尝试过: string absolute = Path.GetFullPath(relative); ??请注意,这将使用进程的当前工作目录,而不是包含可执行文件的目录。如果没有帮助,请澄清您的问题。如果您想获得与.exe相关的路径,请使用 string abs
string absolute = Path.GetFullPath(relative);
??请注意,这将使用进程的当前工作目录,而不是包含可执行文件的目录。如果没有帮助,请澄清您的问题。如果您想获得与.exe相关的路径,请使用
string absolute = Path.Combine(Application.ExecutablePath, relative);
此选项适用于不同驱动器上的路径、驱动器相对路径和实际相对路径。见鬼,如果
基本路径实际上不是绝对路径,它甚至可以工作;它始终使用当前工作目录作为最终回退
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);
}
这是一个比较老的话题,但可能对某些人有用。
我已经解决了一个类似的问题,但在我的例子中,路径并不在文本的开头
因此,我的解决方案如下:
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;
这不取决于你从哪里启动应用程序,也不取决于exe所在的位置吗?诚然,这个问题并不是很清楚。正如你所说,这个问题并不清楚。GetFullPath将从当前工作目录解析。我将编辑我的响应以表明这一点。如果应用程序是通过Windows资源管理器启动的,则当前目录和正在执行的程序集目录似乎是相同的(至少在采取措施使它们不同之前是相同的)。即使您使用指向可执行文件的快捷方式,而快捷方式位于完全不同的位置,这也是正确的。您是指指向当前目录的相对路径,即工作目录,还是相对于.exe的位置?有两种相对路径。一个if的形式为“A\B\C”,并不意味着一个特定的基。另一个格式为“\A\B”或“.\A\B”;这些是相对于当前工作目录的。@Amit Dhall:顺便说一句,接受并投票选出对您有帮助的答案是件好事。只需小心使用Path.Combine。如果“相对”部分以斜杠开头,它可能不会执行您认为会执行的操作。@silky:那么它不是相对的,是吗?似乎是路径。Combine
甚至不能处理驱动器相对路径。它只是忽略了它看起来的初始路径。我正在发布我自己的完整解决方案。这无法处理相对路径。它只接受目录和文件名。如果第二个参数以任何类似。
的开头,它将产生垃圾。@JonathanWood实际上,该“垃圾”(其中包含。
的路径)被.Net中的所有文件操作系统完全接受并解析。如果它困扰您,请对其执行absolute=Path.GetFullPath(absolute)
。这是一个很好的解决方案,因为它根据基本路径组合了绝对路径或相关路径。在我看来,relativePath参数应该重命名为Absolute或relativePath,因为它真正代表的是什么。谢谢,如果这已经是一条绝对路径,那只是一个特例,真的。。。这个函数仍然是用来解析相对路径的,lol。我只是在这里把它命名为,以明确哪个参数是哪个;)@JulioNobre特别是因为这里的参数与Path.Combine相比是相反的。这很容易修复,但我避免使用它,因为我经常使用它来解析工作目录上的相对路径,并且将null作为第一个参数看起来很奇怪。我感谢您的建议,但我只打算在需要将基本路径与另一个路径相结合时使用此帮助器,该路径可能是相对于该基本路径的,也可能是绝对路径。这就是为什么我更喜欢采用以下签名:GetAbsolutePath(String BasePath,String RelativeOrAbsolutePath)。如果某个参数为null,则会引发一个异常,以强调使用此方法必须同时使用这两个参数。再次感谢:-)是的,这是明智的。不必费心编辑这篇文章,只是为了摆弄一些论点。你在重新发明轮子<代码>路径。GetFullPath将自动解析。\n和..\n。另外,一般来说,您正在向String类添加AbsolutePath
扩展函数。。。可能有点过头了。我说Path.GetFullPath始终将基本目录视为应用程序AppDomain的当前目录,这是不是说错了。在这种情况下,Path.GetFullPath无法从其他目录返回完整路径。然而,下面的算法考虑到了这一点。。。我的意思是,您只需要添加另一个可选参数,它将替换CurrentDomainDirectory。