打开 Windows Explorer 目录,选择特定文件(在 Delphi 中)
Posted
技术标签:
【中文标题】打开 Windows Explorer 目录,选择特定文件(在 Delphi 中)【英文标题】:Open Windows Explorer directory, select a specific file (in Delphi) 【发布时间】:2013-02-24 09:51:43 【问题描述】:我有一个程序可以在 Windows 资源管理器中打开一个通过目录路径传递的文件夹:
procedure TfrmAbout.ShowFolder(strFolder: string);
begin
ShellExecute(Application.Handle,PChar('explore'),PChar(strFolder),nil,nil,SW_SHOWNORMAL);
end;
有没有办法也传递这个文件名(完整的文件名路径或只是名称+扩展名)并在 Windows 资源管理器中打开文件夹但也被突出显示/选择?我要去的位置有很多文件,然后我需要在 Windows 中操作该文件。
【问题讨论】:
使用下面 Andreas Rejbrand 回答的方法,我遇到了奇怪的活动,我在 Win7 Pro 32bit 上,有时使用它时,它会打开目录但不突出显示文件,或者它打开一些不寻常的目录并突出显示完全不相关的内容。例如,刚才我用它来选择一个文件,但它打开了我的个人用户文件夹并突出显示了“我的文档”文件夹,而我将它指向的文件甚至不在同一个硬盘上。 我刚刚注意到这个问题的趋势,当文件名中有某些字符时会发生这种情况,例如逗号,它会抛出命令 注意:我的上述问题已通过 Andreas 的更新得到解决,其中包括另一个更具体和可靠的解决方案。 【参考方案1】:是的,您可以在拨打explorer.exe
时使用/select
flag:
ShellExecute(0, nil, 'explorer.exe', '/select,C:\WINDOWS\explorer.exe', nil,
SW_SHOWNORMAL)
一种更花哨(也许也更可靠)的方法 (uses ShellAPI, ShlObj
):
const
OFASI_EDIT = $0001;
OFASI_OPENDESKTOP = $0002;
$IFDEF UNICODE
function ILCreateFromPath(pszPath: PChar): PItemIDList stdcall; external shell32
name 'ILCreateFromPathW';
$ELSE
function ILCreateFromPath(pszPath: PChar): PItemIDList stdcall; external shell32
name 'ILCreateFromPathA';
$ENDIF
procedure ILFree(pidl: PItemIDList) stdcall; external shell32;
function SHOpenFolderAndSelectItems(pidlFolder: PItemIDList; cidl: Cardinal;
apidl: pointer; dwFlags: DWORD): HRESULT; stdcall; external shell32;
function OpenFolderAndSelectFile(const FileName: string): boolean;
var
IIDL: PItemIDList;
begin
result := false;
IIDL := ILCreateFromPath(PChar(FileName));
if IIDL <> nil then
try
result := SHOpenFolderAndSelectItems(IIDL, 0, nil, 0) = S_OK;
finally
ILFree(IIDL);
end;
end;
【讨论】:
传递给参数的字符串必须以null结尾是吗? 是的,编译器确保有空终止符。 请注意:***.com/questions/4291793/… 这并不总是有效,事实上我只是亲眼目睹了它不起作用。 我希望这不会因为重复而关闭,因为正如我在上述问题的评论中所说,另一个接受的答案是 C++ 并使用与此不同的机制。我想看看是否有人可以使用转换为 Delphi 的代码来回答这个问题,因为我不知道如何重写它。 @JerryDodge:我为你实现了。【参考方案2】:delphi.lonzu.net 和 swissdelphicenter 的答案提供了一个更简单的解决方案。我只在 Windows 10、1909 上测试过,但它的要点是:
uses ShellApi, ...
...
var
FileName : TFileName;
begin
FileName := 'c:\temp\somefile.html';
ShellExecute(Handle, 'OPEN',
pchar('explorer.exe'),
pchar('/select, "' + FileName + '"'),
nil,
SW_NORMAL);
end;
这简单易用。我不知道它是否适用于旧版本的 Windows。
【讨论】:
它甚至可以在 Windows XP 中使用,所以这对大多数人来说可能没问题。 我创建了一个空单元,需要更多用途,如 Winapi.Windows、Winapi.Messages、Forms,以上是关于打开 Windows Explorer 目录,选择特定文件(在 Delphi 中)的主要内容,如果未能解决你的问题,请参考以下文章
如何从命令行CMDIDEA的终端快速在explorer/finder资源管理器访达中打开对应的目录(WindowsMac)
在File Explorer的当前路径上直接打开VS Code