Je voudrais coder une fonction à laquelle vous pouvez passer un chemin de fichier, par exemple:
C:\FOLDER\SUBFOLDER\FILE.TXT
et il ouvrirait l'Explorateur Windows avec le dossier contenant le fichier, puis sélectionnerait ce fichier dans le dossier. (Similaire au concept "Afficher dans un dossier" utilisé dans de nombreux programmes.)
Comment puis-je faire ceci?
Le moyen le plus simple de ne pas utiliser les fonctions du shell Win32 consiste à simplement lancer Explorer.exe avec le paramètre /select
. Par exemple, lancer le processus
Explorer.exe /select,"C:\Folder\subfolder\file.txt"
ouvrira une nouvelle fenêtre de l'explorateur vers le sous-dossier C:\Dossier\avec le fichier.txt sélectionné.
Si vous souhaitez le faire par programme sans lancer de nouveau processus, vous devrez utiliser la fonction Shell SHOpenFolderAndSelectItems
, qui est utilisée en interne par la commande /select
pour Explorer.exe. Notez que cela nécessite l'utilisation de PIDL et peut constituer un véritable PITA si vous n'êtes pas familiarisé avec le fonctionnement des API Shell.
Voici une implémentation complète et programmatique de l'approche /select
, avec nettoyage du chemin, grâce aux suggestions de @Bhushan et @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;
}
Référence: Explorer.exe Options de ligne de commande
Lors de l'exécution de la commande si votre chemin contient plusieurs barres obliques, le dossier ne sera pas ouvert et le fichier ne sera pas sélectionné correctement.
C:\a\b\x.txt
au lieu de
C: \\ a \\ b \\ x.txt
La méthode prise en charge depuis Windows XP (non prise en charge par Windows 2000 ou une version antérieure) est 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);
}
}