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 /select
van 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 );