我有一个在Windows资源管理器中打开文件夹的过程,该文件夹传递了一个目录路径:
procedure TfrmAbout.ShowFolder(strFolder: string);
begin
ShellExecute(Application.Handle,PChar('explore'),PChar(strFolder),nil,nil,SW_SHOWNORMAL);
end;
有没有办法同时传递一个文件名(完整文件名路径或只是名称+扩展名),并在Windows资源管理器中打开文件夹,但也要突出显示/选择?我要去的位置有很多文件,然后我需要在Windows中操作该文件。
答案 0 :(得分:37)
是的,您可以在致电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;
答案 1 :(得分:1)
delphi.lonzu.net和swissdelphicenter的答案为此提供了一个更简单的解决方案。我仅在1909年的Windows 10上进行过测试,但是要点是:
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的较早版本。