Как преобразовать относительный путь в абсолютный путь в приложении Windows?
Я знаю, что мы можем использовать server.MapPath () в ASP.NET. Но что мы можем делать в приложении Windows?
Я имею в виду, если есть встроенная функция .NET, которая может справиться с этим ...
Ответы:
Ты пробовала:
string absolute = Path.GetFullPath(relative);
? Обратите внимание, что при этом будет использоваться текущий рабочий каталог процесса, а не каталог, содержащий исполняемый файл. Если это не помогает, поясните, пожалуйста, свой вопрос.
источник
Если вы хотите получить путь относительно вашего .exe, используйте
string absolute = Path.Combine(Application.ExecutablePath, relative);
источник
Path.Combine
даже не может обрабатывать пути, относящиеся к дисководу. Кажется, он просто игнорирует начальный путь. Я публикую свое полное решение...
, это приведет к мусору...
в них включены ) прекрасно принимается и разрешается всеми системами обработки файлов в .Net. Если вас это беспокоит, казнитеabsolute = Path.GetFullPath(absolute)
.Этот работает для путей на разных дисках, для относительных путей и для фактических относительных путей. Черт возьми, это даже работает, если на
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); }
источник
Path.Combine
. Это легко исправить, но я избегаю этого, так как я часто использую его для разрешения относительных путей в рабочем каталоге и присвоение null в качестве первого аргумента выглядит странно.Это немного более старая тема, но может быть кому-то полезна. Я решил аналогичную проблему, но в моем случае путь не был в начале текста.
Итак, вот мое решение:
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; } }
Пример:
источник
Path.GetFullPath
разрешает. \ и .. \ автоматически. Кроме того, вы добавляетеAbsolutePath
функцию расширения в класс String в целом ... может быть немного излишним.