我有以下过程,应该从Delphi程序调用Edge并打开sFileName 中给定地址的本地文件
procedure OpenFileInEdge (
const Handle:HWND;
const sFileName: string);
begin
ShellExecute (Handle, 'open', Pchar('"shell:AppsfolderMicrosoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"'),
Pchar ('"' + sFileName + '"'), nil, sw_ShowNormal);
end;
它运行良好,除非文件名本身或任何父映射的名称中有空格。当存在空间时;E: \Temp\文件名.html"Edge将打开两个选项卡,而不是一个具有指定文件名的选项卡,一个具有名称";E: \临时\文件"另一个带有";Name.html";。
当我将文件从Win Explorer拖动到Edge时,它将地址显示为";E: \Temp\文件%20Name.html"。因此,我已将上述过程中的调用更改为:
Pchar (StringReplace (sFileName, ' ', '%20', [rfReplaceAll])), nil, sw_ShowNormal);
现在Edge打开一个具有以下地址的选项卡:";E: \Temp\File%2520Name.html">
我已经检查过,替换后的文件名确实是";E: \Temp\File%20Name.html";,所以在从Delphi到Edge的过程中;E: \Temp\File%2520Name.html";。
好吧,25是%的十六进制代码,所以我如何告诉Windows不要将%转换为%25?
我找到了几个建议,我尝试过:
- 将文件名置于单引号中-结果与双引号相同
- 将不同的转义符放在%:%/%^%%&%前面
- 将%置于引号中:"%">
当然是
添加"文件:";前缀并没有改变不需要的行为,也没有从空白更改为%20,而且我不想在默认浏览器中打开文档,特别是在Edge中(默认为Chrome(。
有帮助的不是再加一对双引号,而是再加两对双引号。现在的工作程序如下:
procedure OpenFileInEdge (
const Handle:HWND;
const sFileName: string);
begin
ShellExecute (Handle, 'open', Pchar('"shell:AppsfolderMicrosoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"'),
Pchar ('"""' + sFileName + '"""'), nil, sw_ShowNormal);
end;
尝试在文件路径参数中添加file:///前缀,并在中加双引号
"file:///E:TempFile Name.html"