Как преобразовать относительный путь в абсолютный путь в приложения Windows?


Как преобразовать относительный путь в абсолютный путь в приложении Windows?

Я знаю, что мы можем использовать сервер.MapPath () in ASP.NET. но что мы можем сделать в приложении Windows?

Я имею в виду, если есть встроенная функция .NET, которая может справиться с этим...

4 71
c#

4 ответа:

вы пробовали:

string absolute = Path.GetFullPath(relative);

? Обратите внимание, что это будет использовать текущий рабочий каталог процесса, а не каталог, содержащий исполняемый. Если это не поможет, пожалуйста, уточните свой вопрос.

Если вы хотите получить путь относительно вашего .exe и затем использовать

string absolute = Path.Combine(Application.ExecutablePath, relative);

это работает для путей на разных дисках, для относительных путей привода и для фактических относительных путей. Черт, это даже работает, если 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);
}

это немного старая тема, но это может быть полезно для кого-то. Я решил аналогичную проблему, но в моем случае, путь был не в начале текста.

Так вот мое решение:

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;