如何在Windows应用程序中将相对路径转换为绝对路径?

时间:2009-09-09 11:06:50

标签: c#

如何在Windows应用程序中将相对路径转换为绝对路径?

我知道我们可以在ASP.NET中使用server.MapPath()。但是我们可以在Windows应用程序中做些什么呢?

我的意思是,如果有一个.NET内置函数可以处理...

4 个答案:

答案 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;