Jak mogę otworzyć Eksploratora Windows w określonym katalogu z poziomu aplikacji WPF?


150

W aplikacji WPF, gdy użytkownik kliknie przycisk Chcę otworzyć eksplorator Windows w określonym katalogu, jak mam to zrobić?

Spodziewałbym się czegoś takiego:

Windows.OpenExplorer("c:\test");

Odpowiedzi:


306

Dlaczego nie Process.Start(@"c:\test");?


9
Uwaga: możesz tego użyć do uruchamiania innych aplikacji. Process.Start("calc.exe");uruchomi Kalkulator. Możesz przekazać mu pełną ścieżkę do pliku wykonywalnego i uruchomi go.
Jamie Penney

1
LOL, tak, czemu nie. Zabawne, miałem Application.Run w mojej głowie, nie mogłem dostać się do wszechobecnego Process.Start i pomyślałem, że WPF gra ze mną w gry.
Abel

9
uwaga: zgłosi wyjątek, jeśli go tam nie ma. Spróbuj Process.Start ("explorer", @ "c: \ test"); zamiast tego, jeśli nie chcesz obsługiwać wyjątku. Otworzy się domyślne okno. Jednak często lepiej będzie obsłużyć wyjątek.
połączono

9
Uważaj, jeśli ktoś złośliwy (lub po prostu nieświadomy) może dostać tam dowolny ciąg, będzie mógł wykonać dowolny program. Sugestia @amalgamate jest bezpieczniejsza, w przeciwnym razie sprawdź, czy ścieżka jest katalogiem i czy istnieje wcześniej.
Christian Rondeau

3
Inna różnica między Start(dir)i Start("explorer.exe", dir)polega na tym, że to pierwsze będzie wystarczająco inteligentne, aby skupić się na istniejącym oknie, dirjeśli takie istnieje, podczas gdy drugie za każdym razem otwiera nowe okno.
dlf

13

To powinno działać:

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

Lub jeśli potrzebujesz metody uruchamiania programów / otwierania plików i / lub folderów:

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

    StartInformation.FileName = path;

    Process process = Process.Start(StartInformation);

    process.EnableRaisingEvents = true;
}

Następnie wywołaj metodę iw nawiasie umieść tam katalog pliku i / lub folder albo nazwę aplikacji. Mam nadzieję, że to pomogło!


12

Możesz użyć System.Diagnostics.Process.Start.

Lub użyj bezpośrednio WinApi z czymś podobnym do następującego, co spowoduje uruchomienie explorer.exe. Możesz użyć czwartego parametru ShellExecute, aby nadać mu katalog początkowy.

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

Deklaracje pochodzą ze strony pinvoke.net .


1
tak, otrzymywałem błędy, nie wiedziałem o <strike> strajku </strike> btw cool
Edward Tanguay

1
który niestety działa tylko w odpowiedziach / pytaniach, ale nie w komentarzach ;-). Właśnie zaktualizowałem.
Abel

+1 Użyję tego kodu do uruchamiania innych aplikacji, ale Process.Start () był dokładnie tym, czego potrzebowałem.
Edward Tanguay

tak się dzieje, gdy próbujesz odpowiedzieć q. 3 nad ranem: tęsknisz za oczywistością ;-). W każdym razie pamiętam, że często używam ShellExecute, gdy Process.Start nie robi tego, czego chcę (jest kilka scenariuszy, z którymi sobie nie radzi).
Abel

to, co powiedziałeś (w pierwszych dwóch zdaniach), zadziała z aplikacji winForms, Application.Run ("explorer.exe") nie działa. Ponieważ application.run nawet nie przyjmuje ciągu
barlop

12
Process.Start("explorer.exe" , @"C:\Users");

Musiałem tego użyć, inny sposób określenia katalogu tgt spowodowałby zamknięcie okna eksploratora po zakończeniu działania mojej aplikacji.


Jedyna odpowiedź: nie mam Access deniedwyjątku.
Matas Vaitkevicius
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.