. net框架是否有任何方法来转换路径(例如。"C:\whatever.txt")转换为文件URI(例如:“文件:/ / / C: / whatever.txt”)?
这个系统。Uri类具有相反的情况(从文件Uri到绝对路径),但就我所能找到的转换为文件Uri而言,没有任何东西。
另外,这不是一个ASP。网络应用程序。
. net框架是否有任何方法来转换路径(例如。"C:\whatever.txt")转换为文件URI(例如:“文件:/ / / C: / whatever.txt”)?
这个系统。Uri类具有相反的情况(从文件Uri到绝对路径),但就我所能找到的转换为文件Uri而言,没有任何东西。
另外,这不是一个ASP。网络应用程序。
当前回答
变通办法很简单。只需使用Uri(). tostring()方法,然后使用百分比编码的空格(如果有的话)。
string path = new Uri("C:\my exampleㄓ.txt").ToString().Replace(" ", "%20");
正确返回文件:///C:/my%20exampleㄓ.txt
其他回答
这个系统。Uri构造函数能够解析完整的文件路径并将其转换为Uri样式的路径。所以你可以这样做:
var uri = new System.Uri("c:\\foo");
var converted = uri.AbsoluteUri;
VB。NET:
Dim URI As New Uri("D:\Development\~AppFolder\Att\1.gif")
不同的输出:
URI.AbsolutePath -> D:/Development/~AppFolder/Att/1.gif
URI.AbsoluteUri -> file:///D:/Development/~AppFolder/Att/1.gif
URI.OriginalString -> D:\Development\~AppFolder\Att\1.gif
URI.ToString -> file:///D:/Development/~AppFolder/Att/1.gif
URI.LocalPath -> D:\Development\~AppFolder\Att\1.gif
一个衬套:
New Uri("D:\Development\~AppFolder\Att\1.gif").AbsoluteUri
输出:文件:/ / / D: /开发/ ~ AppFolder /丙氨酸/ 1. gif
UrlCreateFromPath拯救!好吧,不完全是,因为它不支持扩展和UNC路径格式,但这并不难克服:
public static Uri FileUrlFromPath(string path)
{
const string prefix = @"\\";
const string extended = @"\\?\";
const string extendedUnc = @"\\?\UNC\";
const string device = @"\\.\";
const StringComparison comp = StringComparison.Ordinal;
if(path.StartsWith(extendedUnc, comp))
{
path = prefix+path.Substring(extendedUnc.Length);
}else if(path.StartsWith(extended, comp))
{
path = prefix+path.Substring(extended.Length);
}else if(path.StartsWith(device, comp))
{
path = prefix+path.Substring(device.Length);
}
int len = 1;
var buffer = new StringBuilder(len);
int result = UrlCreateFromPath(path, buffer, ref len, 0);
if(len == 1) Marshal.ThrowExceptionForHR(result);
buffer.EnsureCapacity(len);
result = UrlCreateFromPath(path, buffer, ref len, 0);
if(result == 1) throw new ArgumentException("Argument is not a valid path.", "path");
Marshal.ThrowExceptionForHR(result);
return new Uri(buffer.ToString());
}
[DllImport("shlwapi.dll", CharSet=CharSet.Auto, SetLastError=true)]
static extern int UrlCreateFromPath(string path, StringBuilder url, ref int urlLength, int reserved);
如果路径以一个特殊的前缀开始,它将被删除。虽然文档中没有提到,但即使缓冲区较小,该函数也会输出URL的长度,因此我首先获取长度,然后分配缓冲区。
一些非常有趣的观察是,当“\\device\path”被正确地转换为“file://device/path”时,特别是“\\localhost\path”被转换为“file:///path”。
WinApi函数设法对特殊字符进行编码,但不像Uri构造函数那样对特定于unicode的字符进行编码。在这种情况下,AbsoluteUri包含正确编码的URL,而OriginalString可用于保留Unicode字符。
至少在。net 4.5+中你还可以做到:
var uri = new System.Uri("C:\\foo", UriKind.Absolute);
上述解决方案在Linux上不起作用。
使用。net Core,尝试执行新的Uri("/home/foo/README.md")会导致一个异常:
Unhandled Exception: System.UriFormatException: Invalid URI: The format of the URI could not be determined.
at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
at System.Uri..ctor(String uriString)
...
您需要给CLR一些关于您拥有哪种URL类型的提示。
如此:
Uri fileUri = new Uri(new Uri("file://"), "home/foo/README.md");
...fileUri.ToString()返回的字符串是"file:///home/foo/README.md"
这也适用于Windows。
new Uri(new Uri(“file://”), @“C:\Users\foo\README.md”).ToString()
...发出“文件:/ / / C: /用户/ foo / README.md”