Есть ли способ .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