Wie kann ich Windows Explorer in einer WPF-App für ein bestimmtes Verzeichnis öffnen?

150

Wie mache ich das in einer WPF-Anwendung, wenn ein Benutzer auf eine Schaltfläche klickt, mit der ich den Windows Explorer in einem bestimmten Verzeichnis öffnen möchte?

Ich würde so etwas erwarten:

Windows.OpenExplorer("c:\test");
Edward Tanguay
quelle

Antworten:

306

Warum nicht Process.Start(@"c:\test");?

Jamie Penney
quelle
9
Hinweis: Sie können dies auch zum Ausführen anderer Anwendungen verwenden. Process.Start("calc.exe");wird Calculator ausführen. Sie können den vollständigen Pfad an eine ausführbare Datei übergeben, die dann ausgeführt wird.
Jamie Penney
1
LOL, ja, warum nicht. Witzig, hatte Application.Run im Kopf, konnte nicht zum allgegenwärtigen Prozess gelangen. Starten Sie und dachte, WPF spiele mit mir.
Abel
9
Hinweis: Es wird eine Ausnahme ausgelöst, wenn es nicht vorhanden ist. Versuchen Sie Process.Start ("Explorer", @ "c: \ test"); stattdessen, wenn Sie die Ausnahme nicht behandeln möchten. Es wird ein Standardfenster geöffnet. Oft ist es jedoch besser, die Ausnahme zu behandeln.
Amalgamate
9
Beachten Sie, dass jemand, der böswillig (oder nur ahnungslos) ist und dort eine Zeichenfolge erhalten kann, jedes Programm ausführen kann. Der Vorschlag von @amalgamate ist sicherer. Überprüfen Sie andernfalls, ob der Pfad ein Verzeichnis ist und ob er bereits vorhanden ist.
Christian Rondeau
3
Ein weiterer Unterschied zwischen Start(dir)und Start("explorer.exe", dir)besteht darin, dass das erstere intelligent genug ist, um das vorhandene Fenster zu fokussieren, dirwenn es eines gibt, während das letztere jedes Mal ein neues Fenster öffnet.
dlf
13

Das sollte funktionieren:

Process.Start(@"<directory goes here>")

Oder wenn Sie eine Methode zum Ausführen von Programmen / Öffnen von Dateien und / oder Ordnern wünschen:

private void StartProcess(string path)
{
    ProcessStartInfo StartInformation = new ProcessStartInfo();

    StartInformation.FileName = path;

    Process process = Process.Start(StartInformation);

    process.EnableRaisingEvents = true;
}

Rufen Sie dann die Methode auf und tragen Sie in Klammern entweder das Verzeichnis der Datei und / oder des Ordners oder den Namen der Anwendung ein. Hoffe das hat geholfen!

Anthony Smyth
quelle
12

Sie können verwenden System.Diagnostics.Process.Start .

Oder verwenden Sie WinApi direkt mit etwas wie dem folgenden, wodurch explorer.exe gestartet wird. Sie können ShellExecute mit dem vierten Parameter ein Startverzeichnis zuweisen.

public partial class Window1 : Window
{
    public Window1()
    {
        ShellExecute(IntPtr.Zero, "open", "explorer.exe", "", "", ShowCommands.SW_NORMAL);
        InitializeComponent();
    }

    public enum ShowCommands : int
    {
        SW_HIDE = 0,
        SW_SHOWNORMAL = 1,
        SW_NORMAL = 1,
        SW_SHOWMINIMIZED = 2,
        SW_SHOWMAXIMIZED = 3,
        SW_MAXIMIZE = 3,
        SW_SHOWNOACTIVATE = 4,
        SW_SHOW = 5,
        SW_MINIMIZE = 6,
        SW_SHOWMINNOACTIVE = 7,
        SW_SHOWNA = 8,
        SW_RESTORE = 9,
        SW_SHOWDEFAULT = 10,
        SW_FORCEMINIMIZE = 11,
        SW_MAX = 11
    }

    [DllImport("shell32.dll")]
    static extern IntPtr ShellExecute(
        IntPtr hwnd,
        string lpOperation,
        string lpFile,
        string lpParameters,
        string lpDirectory,
        ShowCommands nShowCmd);
}

Die Erklärungen stammen von der Website pinvoke.net .

Abel
quelle
1
Ja, ich bekam Fehler, die das verfolgten, wusste nichts über <strike> strike </ strike> übrigens cool
Edward Tanguay
1
Das funktioniert leider nur in Antworten / Fragen, aber nicht in Kommentaren ;-). Ich habe gerade aktualisiert.
Abel
+1 Ich werde diesen Code verwenden, um andere Apps zu starten, aber Process.Start () war genau das, was ich brauchte.
Edward Tanguay
Das passiert, wenn Sie versuchen, q zu beantworten. a 3 Uhr morgens: du vermisst das Offensichtliche ;-). Wie auch immer, ich erinnere mich, dass ich ShellExecute oft verwende, wenn Process.Start nicht das tut, was ich will (es gibt nur wenige Szenarien, die es nicht verarbeiten kann).
Abel
Was Sie (innerhalb der ersten beiden Sätze) gesagt haben, würde von einer Winforms-Anwendung aus funktionieren. Application.Run ("explorer.exe") funktioniert nicht. Weil application.run nicht einmal einen String nimmt
Barlop
12
Process.Start("explorer.exe" , @"C:\Users");

Ich musste dies verwenden. Die andere Möglichkeit, nur das tgt-Verzeichnis anzugeben, schloss das Explorer-Fenster, wenn meine Anwendung beendet wurde.

MarkyMarksFunkyBunch
quelle
Die einzige Antwort bekomme ich keine Access deniedAusnahme.
Matas Vaitkevicius