Hoe open ik Explorer met een specifiek bestand geselecteerd?

Ik wil graag een functie coderen waaraan u een bestandspad kunt doorgeven, bijvoorbeeld:

C:\FOLDER\SUBFOLDER\FILE.TXT

en het zou Windows Verkenner openen met de map die het bestand bevat en vervolgens dit bestand in de map selecteren. (Vergelijkbaar met het concept “Weergeven in map” dat in veel programma’s wordt gebruikt.)

Hoe kan ik dit doen?


Antwoord 1, autoriteit 100%

De eenvoudigste manier zonder Win32-shellfuncties te gebruiken, is door simpelweg explorer.exe te starten met de parameter /select. Bijvoorbeeld het starten van het proces

explorer.exe /select,"C:\Folder\subfolder\file.txt"

opent een nieuw verkennervenster in C:\Folder\subfolder met file.txt geselecteerd.

Als je het programmatisch wilt doen zonder een nieuw proces te starten, moet je de shell-functie gebruiken SHOpenFolderAndSelectItems, wat de opdracht /selectvan explorer.exe zal doen intern gebruiken. Merk op dat dit het gebruik van PIDL’s vereist en een echte PITA kan zijn als u niet bekend bent met hoe de shell-API’s werken.

Hier is een complete, programmatische implementatie van de /select-aanpak, met padopruiming dankzij suggesties van @Bhushan en @tehDorf:

public bool ExploreFile(string filePath) {
    if (!System.IO.File.Exists(filePath)) {
        return false;
    }
    //Clean up file path so it can be navigated OK
    filePath = System.IO.Path.GetFullPath(filePath);
    System.Diagnostics.Process.Start("explorer.exe", string.Format("/select,\"{0}\"", filePath));
    return true;
}

Referentie: Explorer.exe-opdrachtregelschakelaars


Antwoord 2, autoriteit 3%

De ondersteundemethode sinds Windows XP (dwz niet ondersteund op Windows 2000 of eerder) is SHOpenFolderAndSelectItems:

void OpenFolderAndSelectItem(String filename)
{
   // Parse the full filename into a pidl
   PIDLIST_ABSOLUTE pidl;
   SFGAO flags;
   SHParseDisplayName(filename, null, out pidl, 0, out flags);
   try 
   {
      // Open Explorer and select the thing
      SHOpenFolderAndSelectItems(pidl, 0, null, 0);
   }
   finally 
   {
      // Use the task allocator to free to returned pidl
      CoTaskMemFree(pidl);
   }
}

Antwoord 3, autoriteit 3%

Wanneer u de opdracht uitvoert en uw pad meerdere schuine strepen bevat, wordt de map niet geopend en wordt het bestand niet correct geselecteerd
Zorg ervoor dat uw bestandspad er zo uit moet zien

C:\a\b\x.txt

in plaats van

C:\\a\\b\\x.txt


Antwoord 4

Om het antwoord van @Mahmoud Al-Qudsi op te volgen. als hij zegt “het proces starten”, werkte dit voor mij:

// assume variable "path" has the full path to the file, but possibly with / delimiters
for ( int i = 0 ; path[ i ] != 0 ; i++ )
{
    if ( path[ i ] == '/' )
    {
        path[ i ] = '\\';
    }
}
std::string s = "explorer.exe /select,\"";
s += path;
s += "\"";
PROCESS_INFORMATION processInformation;
STARTUPINFOA startupInfo;
ZeroMemory( &startupInfo, sizeof(startupInfo) );
startupInfo.cb = sizeof( STARTUPINFOA );
ZeroMemory( &processInformation, sizeof( processInformation ) );
CreateProcessA( NULL, (LPSTR)s.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInformation );

Other episodes