Ouvrez un dossier à l'aide de Process.Start


153

J'ai vu l' autre sujet et j'ai un autre problème. Le processus démarre (vu au gestionnaire de tâches) mais le dossier ne s'ouvre pas sur mon écran. Qu'est-ce qui ne va pas?

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

êtes-vous sûr que votre chemin est correct?
Nathan Koop

1
Pourquoi voulez-vous appeler Explorer manuellement? Pourquoi ne pas simplement ouvrir le dossier, c'est-à-dire appeler Process.Start avec un ProcessStartInfo avec UseShellExecute défini sur true et Verb sur "open"?
OregonGhost

1
Oui, j'ai essayé d'ouvrir 'explorer.exe' sans le chemin et je n'ai pas fonctionné non plus.
Daniel

Eh bien, je n'ai pas posté car la question n'est pas de savoir comment ouvrir un dossier, mais plutôt comment exécuter explorer.exe pour ouvrir un dossier. Je voulais juste savoir pourquoi vous voulez invoquer l'explorateur directement en premier lieu, car il pourrait y avoir une raison;)
OregonGhost

Je veux juste exclure les options ici, donc cela peut être une question stupide: vous ne faites pas cela sous Linux en utilisant mono, non? Nous parlons d'un environnement Windows?
Fredrik Mörk

Réponses:


271

Vous êtes-vous assuré que le dossier " c:\teste" existe? Si ce n'est pas le cas, l'explorateur s'ouvrira en affichant un dossier par défaut (dans mon cas " C:\Users\[user name]\Documents").

Mise à jour

J'ai essayé les variantes suivantes:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

Si aucun de ceux-ci (enfin, sauf celui qui lance une exception) ne fonctionne sur votre ordinateur, je ne pense pas que le problème réside dans le code, mais dans l'environnement. Si tel est le cas, j'essaierais l'une (ou les deux) des solutions suivantes:

  • Ouvrez la boîte de dialogue Exécuter, entrez "explorer.exe" et appuyez sur Entrée
  • Ouvrez une invite de commande, tapez "explorer.exe" et appuyez sur Entrée

Eh bien, je suis sûr et si cela n'existait pas, ouvrirait n'importe quel dossier de la même manière, ou non?
Daniel

Eh bien, cela pourrait être un problème d'environnement .. J'ai ouvert explorer.exe via cmd et ouvert normal. Aucun des Processs.Start ne fonctionnait sauf 'Process.Start (@ "c: \ does_not_exist");' qui a jeté une exception
Daniel

1
Petite différence si cette fenêtre de l'explorateur est déjà ouverte: Process.Start(path) active la fenêtre (peut uniquement clignoter dans la barre des tâches, pas au premier plan); explorer.exe+ paramètre ouvre une nouvelle fenêtre toujours à l'avant (mais plusieurs fois la même fenêtre). Les deux ont donc des mises en garde.
KekuSemau

Process.Start(@"c:\temp")doit être utilisé avec prudence. S'il c:\temp.comexiste, l'appel de fonction s'ouvrira à la c:\temp.complace. Voir forums.iis.net/p/1239773/2144186.aspx pour plus de détails.
Lex Li

Notez qu'il Process.Start(@"c:\temp")est susceptible d'ouvrir un dossier différent tel que C:\temp.exeou C:\temp.cmd. Voir ce problème où VS lui-même présente un comportement bogué . Vous pouvez éviter cela en utilisant la explorer.exevariante ou (mieux, IMO) en ajoutant toujours un fichier Path.DirectorySeparatorChar. Par exemple Process.Start(@"C:\temp\"),.
binki

46

Juste pour être complet, si tout ce que vous voulez faire est d'ouvrir un dossier, utilisez ceci:

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

Assurez-vous que FileName se termine par Path.DirectorySeparatorCharpour qu'il pointe sans ambiguïté vers un dossier. (Merci à @binki.)

Cette solution ne fonctionnera pas pour ouvrir un dossier et sélectionner un élément, car il ne semble pas y avoir de verbe pour cela.


Cela fonctionne pour moi, à la fois sous Windows et sous Linux en utilisant Mono.
Menno Deij - van Rijswijk

1
Si vous utilisez cette méthode et un dossier tel que C:\teste.exeou C:\teste.cmdexiste, l'Explorateur s'ouvrira dans cet autre dossier au lieu de celui que vous vouliez. Pour éviter cela, vous pouvez ajouter un Path.DirectorySeparatorCharau chemin. Voyez comment VS lui-même fait la même erreur .
binki

Étant donné la réponse de @ Scyssion utilisant "/ select", vous penseriez pouvoir l'utiliser Verb = "select", mais hélas vous ne pouvez pas. Quoi qu'il en soit, bonne réponse!
idbrii

1
Cela fonctionne pour moi dans .NET Core 3, contrairement à la réponse acceptée ci-dessus. Le réglage Verb = "open"n'était pas nécessaire. (Testé sous Windows, d'autres systèmes d'exploitation peuvent différer.)
Walt D

Vous pouvez obtenir les verbes applicables à partir de la .Verbspropriété sur ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/… )
GaryNg

16

Si vous souhaitez sélectionner le fichier ou le dossier, vous pouvez utiliser les éléments suivants:

Process.Start("explorer.exe", "/select, c:\\teste");

2
Pour ouvrir un dossier au lieu de le sélectionner/select/open
passez

5

Vous utilisez le symbole @, ce qui évite d'avoir à échapper vos contre-obliques.

Supprimez le @ ou remplacez \\ par \


N'ouvre toujours pas le dossier .. Démarrage seulement du processus @ task manager
Daniel

Je n'ai aucune autre suggestion, j'ai pu le tester et le faire fonctionner dans Visual C # express 2008
Kevin Laity

1
Je dirais ... des zèbres. Il y a quelque chose qui ne va pas avec votre explorateur, peut-être virii ou quelque chose ...
R. Martinho Fernandes

4

Vous n'avez pas besoin de la double barre oblique inverse lorsque vous utilisez des chaînes sans échappement:

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

3

Vous devez utiliser l'une des System.Diagnostics.Process.Start()surcharges. C'est assez simple!

Si vous ne placez pas le nom de fichier du processus que vous souhaitez exécuter ( explorer.exe), le système le reconnaîtra comme un chemin de dossier valide et essaiera de le joindre au processus Explorer déjà en cours d'exécution. Dans ce cas, si le dossier est déjà ouvert, Explorer ne fera rien.

Si vous placez le nom de fichier du processus (comme vous l'avez fait), le système essaiera d'exécuter une nouvelle instance du processus, en passant la deuxième chaîne comme paramètre. Si la chaîne est un dossier valide, elle est ouverte sur le processus nouvellement créé, sinon, le nouveau processus ne fera rien.

Je ne sais pas comment les chemins de dossiers non valides sont traités par le processus dans tous les cas. L'utilisation System.IO.Directory.Exists()devrait suffire à garantir cela.


N'oubliez pas que vous devez ajouter un fichier Path.DirectorySeparatorChar. Sinon, si un dossier portant le même nom mais .cmdou .exeéventuellement d'autres suffixes existe également, l'Explorateur ouvrira cet autre dossier - ou s'il s'agit en fait d'exécutables ou de scripts, il les exécutera au lieu d'ouvrir le dossier comme vous le souhaitez.
binki

1

Utilisez une version surchargée de la méthode qui prend une instance ProcessStartInfo et définissez la propriété ProcessWindowStyle sur une valeur qui vous convient.


1

Vous échappez à la barre oblique inverse lorsque le signe arobase le fait pour vous.

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

Ce code fonctionne correctement à partir de l'environnement VS2010 et ouvre correctement le dossier local, mais si vous hébergez la même application dans IIS et essayez de l'ouvrir, il échouera à coup sûr.


1

J'ai juste eu ce problème, et j'ai découvert pourquoi. ma raison n'est pas répertoriée ici, donc quiconque obtient ce problème et aucun de ceux-ci ne le résout.

Si vous exécutez Visual Studio en tant qu'autre utilisateur et essayez d'utiliser Process.Start, il s'exécutera dans ce contexte d'utilisateurs et vous ne le verrez pas sur votre écran.


0

Étrange.

S'il ne trouve pas explorer.exe, vous devriez obtenir une exception. S'il ne trouve pas le dossier, il devrait quand même ouvrir un dossier (par exemple, mes documents)

Vous dites qu'une autre copie de l'Explorateur apparaît dans le gestionnaire de tâches, mais vous ne pouvez pas la voir.

Est-il possible qu'il s'ouvre hors écran (c'est-à-dire un autre moniteur)?

Ou faites-vous par hasard cela dans un service non interactif?


Je n'ai qu'un seul moniteur et "Vous dites qu'une autre copie d'Explorateur apparaît dans le gestionnaire de tâches, mais vous ne pouvez pas la voir." c'est vrai ... Je ne sais pas ce que vous vouliez dire "Ou faites-vous par hasard cela dans un service non interactif?"
Daniel

Je voulais dire si le programme que vous écrivez est un service (qui par défaut s'exécute complètement en arrière-plan) par opposition à un programme winforms normal. (Si vous ne savez pas ce qu'est un service, il est peu probable que vous en rédigiez un). Revenant à Taskmanager, si vous sélectionnez «basculer vers», «mettre au premier plan» ou «maximiser» dans cette fenêtre d'exploration cachée, cela apparaît-il?
sgmoore

0

S'ouvre-t-il correctement lorsque vous exécutez "explorer.exe c: \ teste" à partir de votre menu Démarrer? Depuis combien de temps essayez-vous cela? Je vois un comportement similaire lorsque ma machine a beaucoup de processus et lorsque j'ouvre un nouveau processus (les ensembles disent IE) .. il démarre dans le gestionnaire de tâches mais n'apparaît pas dans le front-end. Avez-vous essayé un redémarrage?

Le code suivant devrait ouvrir une nouvelle instance d'explorateur

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

Avez-vous beaucoup d'applications en cours d'exécution lorsque vous essayez cela? Je rencontre parfois un comportement étrange au travail parce que mon système manque de poignées GDI car j'ai tellement de fenêtres ouvertes (nos applications en utilisent beaucoup).

Lorsque cela se produit, les fenêtres et les menus contextuels n'apparaissent pas longtemps jusqu'à ce que je ferme quelque chose pour libérer certaines poignées GDI.

La limite par défaut dans XP et Vista est de 10000. Il n'est pas rare que mon DevStudio ait 1500 poignées GDI, donc si vous avez quelques copies de Dev studio ouvertes, il peut les manger assez rapidement. Vous pouvez ajouter une colonne dans TaskManager pour voir combien de poignées sont utilisées par chaque processus.

Vous pouvez modifier le registre pour augmenter la limite.

Pour plus d'informations, consultez http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

Changez simplement le chemin ou déclarez-le dans un string

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.