L'ouverture d'un dossier dans l'explorateur et sélectionnez 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 faire exécuter cette commande en C#?
10 réponses
Utiliser cette méthode:
Process.Start(String, String)
Le premier argument est une application (explorer.exe), second argument de la méthode sont des arguments 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:\
string filePath = @"E:\test.txt";
if (!File.Exists(filePath))
{
return;
}
// combine the arguments together
// it doesn't matter if there is a space after ','
string argument = "/select, \"" + filePath +"\"";
System.Diagnostics.Process.Start("explorer.exe", argument);
Juste mes cents 2, si votre nom de fichier contient des espaces, c'est-à-dire "c:\My le fichier contient des espaces.txt", vous devrez entourer le nom de fichier avec des guillemets sinon explorer supposera que les autres mots sont des arguments différents...
string argument = "/select, \"" + filePath +"\"";
Si votre chemin contient des virgules, mettre des guillemets autour du chemin fonctionnera lors de L'utilisation du processus.Démarrer (ProcessStartInfo).
Cela ne fonctionnera pas lors de L'utilisation du processus.Démarrer (chaîne, chaîne) cependant. Cela semble être un processus.Start (string, string) supprime réellement les guillemets à l'intérieur de vos arguments.
Voici un exemple simple qui fonctionne pour moi.
string p = @"C:\tmp\this path contains spaces, and,commas\target.txt";
string args = string.Format("/e, /select, \"{0}\"", p);
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "explorer";
info.Arguments = args;
Process.Start(info);
Samuel Yang réponse m'a fait trébucher, voici mes 3 cents d'une valeur.
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 zourtney l'a souligné, mais parce qu'il reconnaîtra les virgules (et éventuellement d'autres caractères) dans les noms de fichiers comme des arguments séparés. Donc, il devrait ressembler à Adrian Hum suggéré.
string argument = "/select, \"" + filePath +"\"";
Utiliser Process.Start
sur explorer.exe
avec /select
argument bizarrement ne fonctionne que pour les chemins de moins de 120 caractères.
J'ai dû utiliser une méthode Windows native pour la 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)] string name, IntPtr bindingContext, [Out] out IntPtr pidl, uint sfgaoIn, [Out] out uint psfgaoOut);
public static void OpenFolderAndSelectItem(string folderPath, string 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 à passer ("/select etc") dans le deuxième paramètre de la méthode Start.
string windir = Environment.GetEnvironmentVariable("windir");
if (string.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 possible pour ne pas trouver le fichier est le chemin ayant des espaces. Par exemple, il ne trouvera pas " explorer / select,c:\space Espace\Espace.txt".
Ajoutez simplement des guillemets doubles avant et après le chemin, comme;
explorer /select,"c:\space space\space.txt"
Ou faites la même chose en C # avec
System.Diagnostics.Process.Start("explorer.exe","/select,\"c:\space space\space.txt\"");