Reputation: 7243
I was looking for something like Server.MapPath in the ASP.NET realm to convert the output of Assembly.GetExecutingAssembly().CodeBase into a file path with drive letter.
The following code works for the test cases I've tried:
private static string ConvertUriToPath(string fileName)
{
fileName = fileName.Replace("file:///", "");
fileName = fileName.Replace("/", "\\");
return fileName;
}
It seems like there should be something in the .NET Framework that would be much better--I just haven't been able to find it.
Upvotes: 6
Views: 2950
Reputation: 42516
Try looking at the Uri.LocalPath property.
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);
}
Upvotes: 19
Reputation: 31
I looked for an answer a lot, and the most popular answer is using Uri.LocalPath. But System.Uri fails to give correct LocalPath if the Path contains “#”. Details are here.
My solution is:
private static string ConvertUriToPath(string fileName)
{
Uri uri = new Uri(fileName);
return uri.LocalPath + Uri.UnescapeDataString(uri.Fragment).Replace('/', '\\');
}
Upvotes: 3
Reputation: 28463
Location can be different to CodeBase. E.g. for files in ASP.NET it likely to be resolved under c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET. See "Assembly.CodeBase vs. Assembly.Location" http://blogs.msdn.com/suzcook/archive/2003/06/26/57198.aspx
Upvotes: 0