Есть ли способ .NET Framework для преобразования URI файлов в пути с буквами диска?
Я искал нечто вроде Server.MapPath в царстве ASP.NET для преобразования вывода Assembly.GetExecutingAssembly(). CodeBase в путь к файлу с буквой диска.
Следующий код работает для тестовых примеров, которые я пробовал:
private static string ConvertUriToPath(string fileName)
{
fileName = fileName.Replace("file:///", "");
fileName = fileName.Replace("/", "\\");
return fileName;
}
Кажется, что в .NET Framework должно быть что-то, что было бы намного лучше - я просто не смог его найти.
Ответы
Ответ 1
Попробуйте найти свойство Uri.LocalPath.
private static string ConvertUriToPath(string fileName)
{
Uri uri = new Uri(fileName);
return uri.LocalPath;
// Some people have indicated that uri.LocalPath doesn't
// always return the corret path. If that the case, use
// the following line:
// return uri.GetComponents(UriComponents.Path, UriFormat.SafeUnescaped);
}
Ответ 2
Я много искал ответа, и самый популярный ответ - Uri.LocalPath. Но System.Uri не дает корректного LocalPath, если Path содержит "#". Подробности здесь.
Мое решение:
private static string ConvertUriToPath(string fileName)
{
Uri uri = new Uri(fileName);
return uri.LocalPath + Uri.UnescapeDataString(uri.Fragment).Replace('/', '\\');
}
Ответ 3
Можете ли вы просто использовать Assembly.Location
?
Ответ 4
Местоположение может отличаться от CodeBase.
Например. для файлов в ASP.NET он может быть разрешен в каталоге c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET.
См. "Assembly.CodeBase vs. Assembly.Location"
http://blogs.msdn.com/suzcook/archive/2003/06/26/57198.aspx