c# uri文件路径_c# - 将文件路径转换为文件URI?

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://” /路径”。]

WinApi函数设法对特殊字符进行编码,但不像Uri construtor那样保留未编码的Unicode特定字符。 在这种情况下,AbsoluteUri包含正确编码的URL,而OriginalString可用于保留Unicode字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值