使用Uri.MakeRelativeUri获取相对路径的结果不符预期疑问
解决Uri.MakeRelativeUri生成相对路径不符合预期的问题
这个问题我之前踩过坑,其实是Uri类处理本地文件路径时的一个容易忽略的细节——它会把末尾没有路径分隔符的路径当成文件,而不是目录来解析!
问题原因分析
你遇到的现象完全符合这个逻辑:
- 当你创建
new System.Uri("C:\\Windows\\System32")时,Uri默认认为这是一个文件名(因为末尾没有\),而不是目录。所以计算相对路径时,它会把System32当作基文件,目标文件Notepad.exe被视为它的“子文件”,最终生成System32/Notepad.exe。 - 同理,基路径
C:\\Windows没有末尾斜杠,Uri也把它当成文件,目标路径是Windows/System32/Notepad.exe,所以相对路径就变成了Windows/System32/Notepad.exe。
快速解决方案:给基路径加上末尾的路径分隔符
只要确保你的基路径末尾带有\,Uri就会正确识别它为目录,计算出的相对路径就符合预期了:
// 场景1:基路径是System32目录(带末尾斜杠) var baseDirUri = new System.Uri("C:\\Windows\\System32\\"); var targetFileUri = new System.Uri("C:\\Windows\\System32\\Notepad.exe"); string relativePath1 = baseDirUri.MakeRelativeUri(targetFileUri).ToString(); // 结果:"Notepad.exe"(符合预期) // 场景2:基路径是Windows目录(带末尾斜杠) var upperBaseDirUri = new System.Uri("C:\\Windows\\"); string relativePath2 = upperBaseDirUri.MakeRelativeUri(targetFileUri).ToString(); // 结果:"System32/Notepad.exe"(符合预期)
更健壮的处理方式(自动补全末尾斜杠)
如果你的基路径是动态获取的,不确定是否带有末尾斜杠,可以用Path类先标准化路径,再自动补全分隔符:
string basePath = Path.GetFullPath("C:\\Windows\\System32"); // 检查是否有末尾分隔符,没有就加上 if (!basePath.EndsWith(Path.DirectorySeparatorChar.ToString())) { basePath += Path.DirectorySeparatorChar; } var baseUri = new Uri(basePath, UriKind.Absolute);
这样不管输入的基路径有没有末尾斜杠,都能保证Uri正确识别为目录,生成的相对路径就不会出错了。
内容的提问来源于stack exchange,提问作者C Robinson
相关产品推荐
相关产品推荐

