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#?

123
demandé sur RandomEngy 2008-12-02 19:42:24

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")
60
répondu Tomasz Smykowski 2016-04-04 07:49:46
// 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);
261
répondu Samuel Yang 2017-07-26 22:30:28

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 +"\"";
31
répondu Adrian Hum 2010-10-03 23:05:36

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);
28
répondu Jan Croonen 2012-03-28 09:38:45

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 +"\"";
17
répondu Phillip Hustwick 2012-01-30 05:51:57

Utiliser " / Sélectionner,c:\file.txt "

Notez qu'il devrait y avoir une virgule après / select au lieu de space..

11
répondu 2009-02-13 06:28:52

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);
    }
}
6
répondu RandomEngy 2016-09-10 15:08:39

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

5
répondu Paul 2008-12-02 16:46:25
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)
5
répondu Corey 2012-03-05 18:33:07

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\"");
2
répondu Zztri 2017-11-08 14:55:03