web-dev-qa-db-fra.com

Comment ouvrir Explorer avec un fichier spécifique sélectionné?

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?

35
Jester

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

89
Mahmoud Al-Qudsi

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

2
Bhushan Pawar

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);
   }
}
0
Ian Boyd