Ouvrir un dossier dans l’explorateur et sélectionner un fichier

J’essaie d’ouvrir un dossier dans l’explorateur avec un fichier sélectionné.

Le code suivant produit une exception de fichier introuvable:

System.Diagnostics.Process.Start( "explorer.exe /select," + listView1.SelectedItems[0].SubItems[1].Text + "\\" + listView1.SelectedItems[0].Text); 

Comment puis-je obtenir cette commande à exécuter en C #?

Utilisez cette méthode :

 Process.Start(Ssortingng, Ssortingng) 

Le premier argument est une application (explorer.exe), le second argument de la méthode est un argument de l’application que vous exécutez.

Par exemple:

dans CMD:

 explorer.exe -p 

en C #:

 Process.Start("explorer.exe", "-p") 
 // suppose that we have a test.txt at E:\ ssortingng filePath = @"E:\test.txt"; if (!File.Exists(filePath)) { return; } // combine the arguments together // it doesn't matter if there is a space after ',' ssortingng argument = "/select, \"" + filePath +"\""; System.Diagnostics.Process.Start("explorer.exe", argument); 

Juste ma valeur de 2 cents, si votre nom de fichier contient des espaces, c.-à-d. “C: \ Mon fichier contient des espaces.txt”, vous devrez entourer le nom du fichier avec des guillemets sinon l’explorateur supposera que les autres mots sont des arguments différents …

 ssortingng argument = "/select, \"" + filePath +"\""; 

Si votre chemin contient des virgules, le fait de placer des guillemets autour du chemin fonctionnera avec Process.Start (ProcessStartInfo).

Cela ne fonctionnera pas quand vous utilisez Process.Start (chaîne, chaîne). Il semble que Process.Start (ssortingng, ssortingng) supprime réellement les guillemets à l’intérieur de vos arguments.

Voici un exemple simple qui fonctionne pour moi.

 ssortingng p = @"C:\tmp\this path contains spaces, and,commas\target.txt"; ssortingng args = ssortingng.Format("/e, /select, \"{0}\"", p); ProcessStartInfo info = new ProcessStartInfo(); info.FileName = "explorer"; info.Arguments = args; Process.Start(info); 

Samuel Yang m’a répondu, voici mes 3 cents.

Adrian Hum a raison, assurez-vous de mettre des guillemets autour de votre nom de fichier. Non pas parce qu’il ne peut pas gérer les espaces comme l’a montré zourtney, mais parce qu’il reconnaîtra les virgules (et éventuellement d’autres caractères) dans les noms de fichiers en tant qu’arguments séparés. Donc, cela devrait ressembler à ce que Adrian Hum a suggéré.

 ssortingng argument = "/select, \"" + filePath +"\""; 

Utilisez “/select,c:\file.txt”

Notez qu’il devrait y avoir une virgule après / select au lieu de l’espace.

Utiliser Process.Start sur explorer.exe avec l’argument /select ne fonctionne curieusement que pour les chemins de moins de 120 caractères.

J’ai dû utiliser une méthode Windows native pour le faire fonctionner dans tous les cas:

 [DllImport("shell32.dll", SetLastError = true)] public static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, uint dwFlags); [DllImport("shell32.dll", SetLastError = true)] public static extern void SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] ssortingng name, IntPtr bindingContext, [Out] out IntPtr pidl, uint sfgaoIn, [Out] out uint psfgaoOut); public static void OpenFolderAndSelectItem(ssortingng folderPath, ssortingng file) { IntPtr nativeFolder; uint psfgaoOut; SHParseDisplayName(folderPath, IntPtr.Zero, out nativeFolder, 0, out psfgaoOut); if (nativeFolder == IntPtr.Zero) { // Log error, can't find folder return; } IntPtr nativeFile; SHParseDisplayName(Path.Combine(folderPath, file), IntPtr.Zero, out nativeFile, 0, out psfgaoOut); IntPtr[] fileArray; if (nativeFile == IntPtr.Zero) { // Open the folder without the file selected if we can't find the file fileArray = new IntPtr[0]; } else { fileArray = new IntPtr[] { nativeFile }; } SHOpenFolderAndSelectItems(nativeFolder, (uint)fileArray.Length, fileArray, 0); Marshal.FreeCoTaskMem(nativeFolder); if (nativeFile != IntPtr.Zero) { Marshal.FreeCoTaskMem(nativeFile); } } 

Vous devez mettre les arguments à transmettre (“/ select etc”) dans le deuxième paramètre de la méthode Start.

 ssortingng windir = Environment.GetEnvironmentVariable("windir"); if (ssortingng.IsNullOrEmpty(windir.Trim())) { windir = "C:\\Windows\\"; } if (!windir.EndsWith("\\")) { windir += "\\"; } FileInfo fileToLocate = null; fileToLocate = new FileInfo("C:\\Temp\\myfile.txt"); ProcessStartInfo pi = new ProcessStartInfo(windir + "explorer.exe"); pi.Arguments = "/select, \"" + fileToLocate.FullName + "\""; pi.WindowStyle = ProcessWindowStyle.Normal; pi.WorkingDirectory = windir; //Start Process Process.Start(pi) 

La raison la plus probable pour laquelle il ne trouve pas le fichier est le chemin comportant des espaces. Par exemple, il ne trouvera pas “explorer / select, c: \ space space \ space.txt”.

Ajoutez simplement des guillemets avant et après le chemin, comme;

 explorer /select,"c:\space space\space.txt" 

ou faire la même chose en C # avec

 System.Diagnostics.Process.Start("explorer.exe","/select,\"c:\space space\space.txt\"");