web-dev-qa-db-fra.com

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 file not found:

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

136
Michael L

Utilisez cette méthode :

Process.Start(String, String)

Le premier argument est une application (Explorer.exe), le second argument de la méthode sont des arguments de l'application que vous exécutez.

Par exemple:

en CMD:

Explorer.exe -p

en C #:

Process.Start("Explorer.exe", "-p")
57
Tomasz Smykowski
// 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);
294
Samuel Yang

Juste mes 2 centimes de dollars, si votre nom de fichier contient des espaces, c'est-à-dire "c:\Mon fichier contient Spaces.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
Adrian Hum

Si votre chemin contient des virgules, le fait d'utiliser des guillemets fonctionnera avec Process.Start (ProcessStartInfo).

Cela ne fonctionnera PAS si vous utilisez Process.Start (chaîne, chaîne). Il semble que Process.Start (chaîne, chaîne) 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);
31
Jan Croonen

La réponse de Samuel Yang m'a fait trébucher, 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 souligné 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. Cela devrait donc ressembler à ce que Adrian Hum a suggéré.

string argument = "/select, \"" + filePath +"\"";
18
Phillip Hustwick

Utilisez "/select,c:\file.txt"

Notez qu'il devrait y avoir une virgule après/select à la place de l'espace.

13
Jigar Mehta

En utilisant Process.Start sur Explorer.exe avec le /select _ argument ne fonctionne curieusement que pour les chemins de moins de 120 caractères.

J'ai dû utiliser une méthode Windows native pour que cela fonctionne 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);
    }
}
11
RandomEngy

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

5
Paul
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
Corey

La raison la plus probable pour ne pas trouver le fichier est le chemin contenant des espaces. Par exemple, il ne trouvera pas "Explorer/sélectionner, 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\"");
3
Zztri

C'est peut-être un peu exagéré, mais j'aime les fonctions de commodité, alors prenez ceci:

    public static void ShowFileInExplorer(FileInfo file) {
        StartProcess("Explorer.exe", null, "/select, "+file.FullName.Quote());
    }
    public static Process StartProcess(FileInfo file, params string[] args) => StartProcess(file.FullName, file.DirectoryName, args);
    public static Process StartProcess(string file, string workDir = null, params string[] args) {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.FileName = file;
        proc.Arguments = string.Join(" ", args);
        Logger.Debug(proc.FileName, proc.Arguments); // Replace with your logging function
        if (workDir != null) {
            proc.WorkingDirectory = workDir;
            Logger.Debug("WorkingDirectory:", proc.WorkingDirectory); // Replace with your logging function
        }
        return Process.Start(proc);
    }

Voici la fonction d'extension que j'utilise comme <chaîne> .Quote ():

static class Extensions
{
    public static string Quote(this string text)
    {
        return SurroundWith(text, "\"");
    }
    public static string SurroundWith(this string text, string surrounds)
    {
        return surrounds + text + surrounds;
    }
}
0
Bluescream