c# - 打开文件://URI to specific# (hash) ID

标签 c# .net windows

我想打开一个导航到带有ID的特定标题的本地HTML文件。string url = "file:///C:/myFile.html#myHeading"如果我将URL直接粘贴到浏览器中,它将正确导航到所需的标题。
但是,当我尝试让系统处理URL时,它会完全忽略哈希。

ProcessStartInfo si = new ProcessStartInfo(url);
si.UseShellExecute = true;
Process.Start(si);
只会打开file:///C:/myFile.html
有什么办法可以使我工作吗?
可悲的是,我不知道这种剥离发生在哪里,所以到目前为止我的研究是空的。
我尝试用其转义形式%23替换哈希符号,这当然不起作用(找不到指定的文件)。
在此期间,我正在使用一种变通方法:
here中,我编写了一个扩展名,它告诉我可执行文件的路径,该可执行文件是用于打开具有给定扩展名的文件的默认应用程序。
public static string getDefaultAssociation(string extension)
{
    if (extension.Substring(0, 1) != ".")
    {
        int os = extension.IndexOf('.');
        if (os > 0)
        {
            extension = extension.Substring(os);
        }
        else
        {
            extension = "." + extension;
        }
    }
    const int S_OK = 0;
    const int S_FALSE = 1;

    uint length = 0;
    uint ret = AssocQueryString(AssocF.None, AssocStr.Executable, extension, null, null, ref length);
    if (ret != S_FALSE)
    {
        //throw new InvalidOperationException("Could not determine associated string");
        WriteLog("Could not determine associated string");
        return "";
    }

    var sb = new StringBuilder((int)length); // (length-1) will probably work too as the marshaller adds null termination
    ret = AssocQueryString(AssocF.None, AssocStr.Executable, extension, null, sb, ref length);
    if (ret != S_OK)
    {
        //throw new InvalidOperationException("Could not determine associated string");
        WriteLog("Could not determine associated string");
        return "";
    }

    return sb.ToString();
}

[DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern uint AssocQueryString(
    AssocF flags,
    AssocStr str,
    string pszAssoc,
    string pszExtra,
    [Out] StringBuilder pszOut,
    ref uint pcchOut
);

[Flags]
public enum AssocF
{
    None = 0,
    Init_NoRemapCLSID = 0x1,
    Init_ByExeName = 0x2,
    Open_ByExeName = 0x2,
    Init_DefaultToStar = 0x4,
    Init_DefaultToFolder = 0x8,
    NoUserSettings = 0x10,
    NoTruncate = 0x20,
    Verify = 0x40,
    RemapRunDll = 0x80,
    NoFixUps = 0x100,
    IgnoreBaseClass = 0x200,
    Init_IgnoreUnknown = 0x400,
    Init_Fixed_ProgId = 0x800,
    Is_Protocol = 0x1000,
    Init_For_File = 0x2000
}

public enum AssocStr
{
    Command = 1,
    Executable,
    FriendlyDocName,
    FriendlyAppName,
    NoOpen,
    ShellNewValue,
    DDECommand,
    DDEIfExec,
    DDEApplication,
    DDETopic,
    InfoTip,
    QuickTip,
    TileInfo,
    ContentType,
    DefaultIcon,
    ShellExtension,
    DropTarget,
    DelegateExecute,
    Supported_Uri_Protocols,
    ProgID,
    AppID,
    AppPublisher,
    AppIconReference,
    Max
}
所以我可以用
string def = getDefaultAssociation("html");
ProcessStartInfo si = new ProcessStartInfo(def);
si.Arguments = url;
si.UseShellExecute = true;
Process.Start(si);
直接告诉我的默认浏览器转到文件URL,包括ID哈希。

最佳答案

根据RFC,文件方案(file://)仅不支持 anchor 或实际上不支持任何参数。因此,使用此方案的任何进程url都可以忽略查询字符串, anchor 或文件路径以外的其他任何东西,这就是这里发生的情况。如果您尝试file:///C:/myFile.html?x=1-查询字符串也将被剥离。另一方面,如果您尝试使用http://google.com?x=1#test,则它将在浏览器中完全打开该URL,因为其他方案。
因此,我想说它可以按预期工作,并且您的解决方法很好。

关于c# - 打开文件://URI to specific# (hash) ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64578001/

相关文章:

c# - 避免使用不支持序列化的类

c# - 查找与集合中某个模式匹配的所有记录

c# - 事件参数; "sender as Object"或 "sender as T"?

c# - 嵌套的异步方法和线程池 Asp.Net

c# - 静态字段 - 使用静态的字符串插值

c# - 获取网页的所有 anchor 标签

c++ - 为什么在类对象数组上调用 delete 而不是 delete[] 会导致堆损坏?

c# - 如何用数组搜索数组?

Python UDP 套接字半随机接收失败

c++ - 确定与 COM RPC 服务器通信的客户端进程的进程 ID