6

我在 ASP.NET 领域中寻找类似 Server.MapPath 的东西,以将 Assembly.GetExecutingAssembly().CodeBase 的输出转换为带有驱动器号的文件路径。

以下代码适用于我尝试过的测试用例:

私有静态字符串 ConvertUriToPath(字符串文件名)
{
    fileName = fileName.Replace("file:///", "");
    fileName = fileName.Replace("/", "\\");
    返回文件名;
}

似乎 .NET Framework 中应该有一些更好的东西——我只是没能找到它。

4

4 回答 4

18

尝试查看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's the case, use
   // the following line:
   // return uri.GetComponents(UriComponents.Path, UriFormat.SafeUnescaped);
}
于 2008-11-10T19:08:54.287 回答
3

我找了很多答案,最流行的答案是使用Uri.LocalPath。但是如果路径包含“#”,System.Uri 无法给出正确的 LocalPath。详情在这里

我的解决方案是:

private static string ConvertUriToPath(string fileName)
{
   Uri uri = new Uri(fileName);
   return uri.LocalPath + Uri.UnescapeDataString(uri.Fragment).Replace('/', '\\');
}
于 2012-02-22T22:48:03.373 回答
0

你能用Assembly.Location吗?

于 2008-11-10T19:01:24.910 回答
0

位置可以与 CodeBase 不同。例如,对于 ASP.NET 中的文件,它可能会在 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET 下解析。请参阅“Assembly.CodeBase 与 Assembly.Location” http://blogs.msdn.com/suzcook/archive/2003/06/26/57198.aspx

于 2009-06-10T07:59:03.067 回答