Как преобразовать относительный путь в абсолютный путь в приложения Windows?
Как преобразовать относительный путь в абсолютный путь в приложении Windows?
Я знаю, что мы можем использовать сервер.MapPath () in ASP.NET. но что мы можем сделать в приложении Windows?
Я имею в виду, если есть встроенная функция .NET, которая может справиться с этим...
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;