162 votes

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 non trouvé :

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

Comment puis-je faire en sorte que cette commande s'exécute en C# ?

358voto

Samuel Yang Points 901
// 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);

1 votes

Il a été significatif pour moi :) il n'a pas seulement ouvert le répertoire mais a aussi sélectionné le fichier en question :) merci.

2 votes

Cela fonctionne comme un charme, mais avez-vous une idée de la façon dont nous pouvons faire cela pour plusieurs fichiers ?

7 votes

Petite remarque, l'argument /select avec le chemin d'accès au fichier ne semble pas fonctionner pour moi si mon chemin d'accès au fichier utilise des barres obliques. Je dois donc faire filePath = filePath.Replace('/', ' \\ ') ;

47voto

tomaszs Points 5633

Utilisez cette méthode :

Process.Start(String, String)

Le premier argument est une application (explorer.exe), le deuxième 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")

38 votes

Cela ne sélectionne pas le fichier comme la réponse de Samuel Yangs

3 votes

-p n'est pas suffisant pour sélectionner le fichier

0 votes

Je suis d'accord, cela ne sélectionne pas un fichier...

41voto

Jan Croonen Points 101

Si votre chemin d'accès contient des virgules, le fait de mettre des guillemets autour du chemin d'accès fonctionnera lorsque vous utiliserez Process.Start(ProcessStartInfo).

Cependant, cela ne fonctionnera PAS si vous utilisez Process.Start(string, string). Il semble que Process.Start(string, string) supprime en fait les guillemets à l'intérieur de vos args.

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);

0 votes

Cela devrait être la réponse acceptée. Il manque simplement une gestion appropriée des exceptions pour les différents échecs possibles (problème de droits, mauvais chemin, etc.).

1 votes

C'est la bonne réponse, la réponse acceptée ne fonctionne pas, la réponse de Yang ne fonctionne pas non plus.

31voto

Adrian Hum Points 151

Si le nom de votre fichier contient des espaces, par exemple "c : \My File Contains Spaces.txt", vous devrez entourer le nom du fichier avec des guillemets sinon l'explorateur supposera que les autres mots sont des arguments différents...

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

4 votes

En fait, non, vous ne le faites pas. L'exemple de @Samuel Yang fonctionne avec les chemins contenant des espaces (testé sur Win7).

8 votes

Lisez la réponse de Phil Hustwick ci-dessous sur la raison pour laquelle vous devez mettre des guillemets à l'intérieur de chaque mot.

18voto

Phillip Hustwick Points 101

La réponse de Samuel Yang m'a fait trébucher, voici mes 3 centimes d'euros.

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 comme des arguments séparés. Cela devrait donc ressembler à ce que Adrian Hum a suggéré.

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

1 votes

Et assurez-vous que filePath ne contient pas " en elle. Ce caractère est apparemment illégal sur les systèmes Windows mais autorisé sur tous les autres (par exemple, les systèmes POSIX), donc il faut encore plus de code si vous voulez la portabilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X