我想打开一个导航到带有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/