2013-03-08 14 views
11

Mam procedurę, aby otworzyć folder w Eksploratorze Windows, która jest przekazywana ścieżkę katalogu:katalog Otwórz Eksploratora Windows, wybrać konkretny plik (w Delphi)

procedure TfrmAbout.ShowFolder(strFolder: string); 
begin 
    ShellExecute(Application.Handle,PChar('explore'),PChar(strFolder),nil,nil,SW_SHOWNORMAL); 
end; 

Czy istnieje sposób również przekazać to na nazwa pliku (pełna ścieżka do nazwy pliku lub tylko nazwa + rozszerzenie) i czy folder jest otwarty w Eksploratorze Windows, ale także czy jest zaznaczony/wybrany? Lokalizacja, którą mam zamiar, ma wiele plików i muszę wtedy manipulować tym plikiem w systemie Windows.

+0

Stosując metodę jak odpowiedział Andreasa Rejbranda poniżej, trafiam w ślepy zaułek z dziwną aktywnością, jestem na Win7 Pro 32bit, a czasami używając tego, albo otwiera katalog, ale nie podświetla pliku, albo otwiera niektóre ze zwykłego katalogu i podkreśla coś kompletnego nieistotne. Na przykład, właśnie użyłem go do wyboru pliku, ale otworzyłem mój osobisty folder użytkownika i podświetliłem folder "Moje dokumenty", gdy plik, do którego go przekierowałem, nie znajduje się nawet na tym samym dysku twardym. –

+0

Właśnie zauważyłem trend z tym problemem, zdarza się, gdy w nazwie pliku znajdują się pewne znaki, na przykład przecinek, który zrzuca polecenie: –

+0

UWAGA: Powyższy problem został rozwiązany dzięki aktualizacji autorstwa Andreasa, w tym innej bardziej szczegółowej i niezawodnej rozwiązanie. –

Odpowiedz

33

Tak, można użyć /select flag kiedy zadzwonić explorer.exe:

ShellExecute(0, nil, 'explorer.exe', '/select,C:\WINDOWS\explorer.exe', nil, 
    SW_SHOWNORMAL) 

Nieco bardziej wyszukane (i prawdopodobnie również bardziej wiarygodne) podejście (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; 
+0

Łańcuch przekazany do parametru musi mieć wartość "null", czy jest on? – Raul

+0

Tak, kompilator upewnia się, że istnieją terminatory o wartości zero. –

+1

Uwaga: http://stackoverflow.com/questions/4291793/selecting-file-in-windows-explorers-does-not-always-work?rq=1 To nie zawsze działa, a ja po prostu byłem świadkiem to nie działa. –