You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在路径中转义#符号以获取正确的绝对路径?

解决带#号的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:42:44