Linux系统下如何使用UriBuilder处理文件路径
问题根因
UriBuilder单字符串入参的构造函数,默认会优先按网络URI规则解析输入内容:
- Windows下带盘符前缀的路径会被自动识别为本地文件路径,自动补全
file:///协议头,所以可以正常解析 - Linux下
/开头的绝对路径没有明确的协议标识,构造函数会尝试按[scheme]://[hostname]/[path]的格式解析,自然找不到合法主机名,抛出格式异常
你直接传入未指定UriKind的Uri对象时报错,是因为构造Uri时如果没有明确指定路径类型,运行时无法判断你的输入是相对路径还是绝对路径,就会返回UriKind.RelativeOrUnknown的状态,传给UriBuilder时就触发格式校验失败。
可行解决方法
- 明确指定路径类型构造Uri后再传入
UriBuilder
using System; public class Program { public static void Main() { // 构造Uri时明确指定是绝对路径 var fileUri = new Uri("/path/to/file", UriKind.Absolute); var b = new UriBuilder(fileUri); Console.WriteLine(b.ToString()); // 输出:file:///path/to/file } }
- 直接给路径补全file协议前缀
var b = new UriBuilder($"file://{"/path/to/file"}");
- 如果仅需处理本地文件路径、不需要URI结构,优先用跨平台兼容的
Path类操作,避免URI校验逻辑的额外限制
// 规范化本地路径 string normalizedPath = Path.GetFullPath("/path/to/file"); Console.WriteLine(normalizedPath); // Linux下输出:/path/to/file // Windows下输出对应磁盘下的全路径
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

