如何在路径中转义#符号以获取正确的绝对路径?
解决带#号的File URI绝对路径获取问题
在URI规范中,#是片段标识符的分隔符,直接用包含#的字符串创建Uri对象时,#之后的内容会被识别为片段(可通过uri.Fragment获取),而非路径的一部分,这就是AbsolutePath只返回C:\的原因。
以下是几种可行的解决方法:
方法1:提前转义#号为URI合法格式
URI中#的转义序列是%23,将原始字符串中的#替换为%23后再创建Uri,就能正确解析完整路径:
class Program { static void Main(string[] args) { var codeBase = "file:///C:/%23MyFolder/TestApp/bin/Debug/net6.0-windows/TestApp.dll"; var uri = new Uri(codeBase); var path = Uri.UnescapeDataString(uri.AbsolutePath); Console.WriteLine(path); // 输出:C:\#MyFolder\TestApp\bin\Debug\net6.0-windows\TestApp.dll } }
方法2:对现有字符串手动转义#号
如果无法提前处理输入字符串,可在代码中先替换#为%23,再解析:
class Program { static void Main(string[] args) { var codeBase = "file:///C:/#MyFolder/TestApp/bin/Debug/net6.0-windows/TestApp.dll"; // 转义路径中的#号 var escapedCodeBase = codeBase.Replace("#", "%23"); var uri = new Uri(escapedCodeBase); var path = Uri.UnescapeDataString(uri.AbsolutePath); Console.WriteLine(path); } }
方法3:拼接AbsolutePath与Fragment(仅适用于无真实片段的场景)
如果确定#之后的内容都是路径而非真实片段,可以拼接AbsolutePath和去掉开头#的Fragment:
class Program { static void Main(string[] args) { var codeBase = "file:///C:/#MyFolder/TestApp/bin/Debug/net6.0-windows/TestApp.dll"; var uri = new Uri(codeBase); var fullPath = Uri.UnescapeDataString(uri.AbsolutePath + uri.Fragment.TrimStart('#')); Console.WriteLine(fullPath); } }
注意:推荐优先使用前两种方法,因为第三种方法仅适用于
#之后无真实片段标识符的场景,若后续路径中存在合法片段,会导致解析错误。
内容的提问来源于stack exchange,提问作者Kliver Max
相关产品推荐
相关产品推荐

