Öffnen Sie einen Ordner mit Process.Start


148

Ich habe das andere Thema gesehen und habe ein anderes Problem. Der Prozess startet (siehe Task-Manager), aber der Ordner wird auf meinem Bildschirm nicht geöffnet. Was ist los mit dir?

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

Bist du sicher, dass dein Weg korrekt ist?
Nathan Koop

1
Warum möchten Sie den Explorer manuell aufrufen? Warum nicht einfach den Ordner öffnen, dh Process.Start mit einem ProcessStartInfo aufrufen, wobei UseShellExecute auf true und Verb auf "open" gesetzt ist?
OregonGhost

1
Ja, ich habe versucht, 'explorer.exe' ohne den Pfad zu öffnen und habe auch nicht funktioniert.
Daniel

Nun, ich habe nicht gepostet, weil die Frage nicht ist, wie man einen Ordner öffnet, sondern wie man explorer.exe ausführt, um einen Ordner zu öffnen. Ich wollte nur wissen, warum Sie Explorer direkt aufrufen möchten, weil es einen Grund geben könnte;)
OregonGhost

Ich möchte hier nur Optionen ausschließen, daher kann dies eine dumme Frage sein: Sie tun dies unter Linux nicht mit Mono, oder? Wir sprechen von einer Windows-Umgebung?
Fredrik Mörk

Antworten:


266

Haben Sie sichergestellt, dass der Ordner " c:\teste" vorhanden ist? Wenn dies nicht der Fall ist, wird der Explorer geöffnet und zeigt einen Standardordner an (in meinem Fall " C:\Users\[user name]\Documents").

Aktualisieren

Ich habe folgende Variationen ausprobiert:

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

Wenn keines davon (außer dem, das eine Ausnahme auslöst) auf Ihrem Computer funktioniert, liegt das Problem meines Erachtens nicht im Code, sondern in der Umgebung. In diesem Fall würde ich eine (oder beide) der folgenden Möglichkeiten ausprobieren:

  • Öffnen Sie das Dialogfeld "Ausführen", geben Sie "explorer.exe" ein und drücken Sie die Eingabetaste
  • Öffnen Sie eine Eingabeaufforderung, geben Sie "explorer.exe" ein und drücken Sie die Eingabetaste

Nun, ich bin sicher und wenn es nicht existiert, würde es einen Ordner auf die gleiche Weise öffnen oder nicht?
Daniel

Nun, dann könnte es ein Umgebungsproblem sein. Ich habe explorer.exe über cmd geöffnet und normal geöffnet. Keiner der Processs.Start funktionierte außer 'Process.Start (@ "c: \ does_not_exist");' das warf eine Ausnahme
Daniel

1
Kleiner Unterschied, wenn das Explorer-Fenster bereits geöffnet ist: Process.Start(path) Aktiviert das Fenster (darf nur in der Taskleiste blinken, nicht nach vorne gebracht); explorer.exeDer Parameter + öffnet ein neues Fenster immer vorne (aber mehrmals dasselbe Fenster). Also haben beide Vorbehalte.
KekuSemau

Process.Start(@"c:\temp")muss mit Vorsicht verwendet werden. Wenn c:\temp.comvorhanden, wird der Funktionsaufruf geöffnetc:\temp.com stattdessen . Weitere Informationen finden Sie unter forums.iis.net/p/1239773/2144186.aspx .
Lex Li

Beachten Sie, dass Process.Start(@"c:\temp")ein anderer Ordner wie C:\temp.exeoder geöffnet werden kann C:\temp.cmd. In diesem Problem zeigt VS selbst ein fehlerhaftes Verhalten . Sie können dies vermeiden, indem Sie entweder die explorer.exeVariante verwenden oder (besser IMO) immer a anhängen Path.DirectorySeparatorChar. Zum Beispiel Process.Start(@"C:\temp\").
Binki

46

Wenn Sie der Vollständigkeit halber nur einen Ordner öffnen möchten, verwenden Sie Folgendes:

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

Stellen Sie sicher, dass FileName mit endet Path.DirectorySeparatorChar, damit es eindeutig auf einen Ordner verweist . (Danke an @binki.)

Diese Lösung funktioniert nicht zum Öffnen eines Ordners und Auswählen eines Elements, da es dafür kein Verb zu geben scheint.


Dies funktioniert für mich sowohl unter Windows als auch unter Linux mit Mono.
Menno Deij - van Rijswijk

1
Wenn Sie diese Methode verwenden und ein Ordner wie C:\teste.exeoder C:\teste.cmdvorhanden ist, wird der Explorer für diesen anderen Ordner anstelle des von Ihnen beabsichtigten Ordners geöffnet. Um dies zu vermeiden, können Sie a Path.DirectorySeparatorCharan den Pfad anhängen . Sehen Sie, wie VS selbst den gleichen Fehler macht .
Binki

Wenn Sie die Antwort von @ Scyssion mit "/ select" geben, würden Sie denken, Sie könnten sie verwenden Verb = "select", aber leider nicht. Egal, tolle Antwort!
idbrii

1
Dies funktioniert bei mir in .NET Core 3 im Gegensatz zu der oben akzeptierten Antwort. Einstellung Verb = "open"war nicht notwendig. (In Windows getestet, können andere Betriebssysteme abweichen.)
Walt D

Sie können die entsprechenden Verben von der .VerbsEigenschaft auf ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/… )
GaryNg

16

Wenn Sie die Datei oder den Ordner auswählen möchten, können Sie Folgendes verwenden:

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

2
Um einen Ordner zu öffnen, anstatt ihn auszuwählen, wechseln Sie einfach /selectzu/open
SushiGuy

5

Sie verwenden das @ -Symbol, wodurch die Notwendigkeit entfällt, Ihren Backslashes zu entkommen.

Entfernen Sie das @ oder ersetzen Sie \\ durch \


Öffnen Sie den Ordner immer noch nicht. Starten Sie nur den process @ task Manager
Daniel

Ich habe keine weiteren Vorschläge, ich konnte es in Visual C # express 2008 testen und zum Laufen bringen
Kevin

1
Ich würde sagen ... Zebras. Es stimmt etwas nicht mit Ihrem Entdecker, vielleicht Virii oder so ...
R. Martinho Fernandes

4

Sie benötigen keinen doppelten Backslash, wenn Sie nicht entkappte Zeichenfolgen verwenden:

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

3

Sie sollten eine der verwenden System.Diagnostics.Process.Start() Überladungen verwenden. Es ist ganz einfach!

Wenn Sie den Dateinamen des Prozesses, den Sie ausführen möchten, nicht platzieren ( explorer.exe), erkennt das System ihn als gültigen Ordnerpfad und versucht, ihn an den bereits ausgeführten Explorer-Prozess anzuhängen. In diesem Fall unternimmt der Explorer nichts, wenn der Ordner bereits geöffnet ist.

Wenn Sie den Dateinamen des Prozesses eingeben (wie Sie es getan haben), versucht das System, eine neue Instanz des Prozesses auszuführen, wobei die zweite Zeichenfolge als Parameter übergeben wird. Wenn die Zeichenfolge ein gültiger Ordner ist, wird sie im neu erstellten Prozess geöffnet. Wenn nicht, führt der neue Prozess nichts aus.

Ich weiß auf keinen Fall, wie ungültige Ordnerpfade vom Prozess behandelt werden. Die Verwendung System.IO.Directory.Exists()sollte ausreichen, um dies sicherzustellen.


Vergessen Sie nicht, dass Sie a anhängen müssen Path.DirectorySeparatorChar. Wenn andernfalls ein Ordner mit demselben Namen, aber .cmdoder .exemöglicherweise anderen Suffixen vorhanden ist, wird der Explorer für diesen anderen Ordner geöffnet. Wenn es sich tatsächlich um ausführbare Dateien oder Skripts handelt, werden diese ausgeführt, anstatt den Ordner wie beabsichtigt zu öffnen.
Binki

1

Verwenden Sie eine überladene Version der Methode, die eine ProcessStartInfo-Instanz verwendet, und setzen Sie die ProcessWindowStyle-Eigenschaft auf einen für Sie geeigneten Wert.


1

Sie entkommen dem Backslash, wenn das at-Zeichen dies für Sie erledigt.

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

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

Dieser Code funktioniert in der VS2010-Umgebung einwandfrei und öffnet den lokalen Ordner ordnungsgemäß. Wenn Sie jedoch dieselbe Anwendung in IIS hosten und versuchen, sie zu öffnen, schlägt dies mit Sicherheit fehl.


1

Ich hatte gerade dieses Problem und fand heraus, warum. Mein Grund ist hier nicht aufgeführt, so dass jeder andere, der dieses Problem bekommt und keiner von diesen es behebt.

Wenn Sie Visual Studio als einen anderen Benutzer ausführen und versuchen, Process.Start zu verwenden, wird es in diesem Benutzerkontext ausgeführt und auf Ihrem Bildschirm nicht angezeigt.


0

Seltsam.

Wenn explorer.exe nicht gefunden werden kann, sollten Sie eine Ausnahme erhalten. Wenn der Ordner nicht gefunden werden kann, sollte dennoch ein Ordner geöffnet werden (z. B. meine Dokumente).

Sie sagen, dass eine andere Kopie des Explorers im Taskmanager angezeigt wird, aber Sie können sie nicht sehen.

Ist es möglich, dass es sich außerhalb des Bildschirms öffnet (dh eines anderen Monitors)?

Oder tun Sie dies zufällig in einem nicht interaktiven Dienst?


Ich habe nur 1 Monitor und "Sie sagen, dass eine weitere Kopie des Explorers im Taskmanager angezeigt wird, aber Sie können sie nicht sehen." Das ist richtig. Ich weiß nicht, was Sie gemeint haben. "Oder tun Sie dies zufällig in einem nicht interaktiven Dienst?"
Daniel

Ich meinte, wenn das Programm, das Sie schreiben, ein Dienst ist (der standardmäßig vollständig im Hintergrund ausgeführt wird), im Gegensatz zu einem normalen Winforms-Programm. (Wenn Sie nicht wissen, was ein Dienst ist, schreiben Sie wahrscheinlich keinen). Wenn Sie zum Task-Manager zurückkehren und in diesem versteckten Explorer-Fenster entweder "Wechseln zu", "Nach vorne bringen" oder "Maximieren" auswählen, wird es angezeigt?
sgmoore

0

Wird es korrekt geöffnet, wenn Sie "explorer.exe c: \ teste" in Ihrem Startmenü ausführen? Wie lange versuchst du das schon? Ich sehe ein ähnliches Verhalten, wenn mein Computer viele Prozesse hat und wenn ich einen neuen Prozess öffne (Sätze sagen IE). Er startet im Task-Manager, wird aber nicht im Front-End angezeigt. Haben Sie einen Neustart versucht?

Der folgende Code sollte eine neue Explorer-Instanz öffnen

class sample{

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

0

Haben Sie viele Anwendungen ausgeführt, wenn Sie dies versuchen? Bei der Arbeit stoße ich manchmal auf seltsames Verhalten, weil meinem System die GDI-Handles ausgehen, da so viele Fenster geöffnet sind (unsere Apps verwenden viel).

In diesem Fall werden Fenster und Kontextmenüs erst angezeigt, wenn ich etwas schließe, um einige GDI-Handles freizugeben.

Das Standardlimit in XP und Vista ist 10000. Es ist nicht ungewöhnlich, dass mein DevStudio 1500 GDI-Handles hat. Wenn Sie also ein paar Kopien von Dev Studio geöffnet haben, kann es diese ziemlich schnell auffressen. Sie können im TaskManager eine Spalte hinzufügen, um zu sehen, wie viele Handles von jedem Prozess verwendet werden.

Sie können eine Registrierungsoptimierung vornehmen, um das Limit zu erhöhen.

Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

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

Ändern Sie einfach den Pfad oder deklarieren Sie ihn in a string

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.