Làm cách nào tôi có thể mở Windows Explorer đến một thư mục nhất định từ trong ứng dụng WPF?


150

Trong một ứng dụng WPF, khi người dùng nhấp vào nút tôi muốn mở Windows explorer đến một thư mục nhất định, tôi phải làm thế nào?

Tôi sẽ mong đợi một cái gì đó như thế này:

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

Câu trả lời:


306

Tại sao không Process.Start(@"c:\test");?


9
Lưu ý: Bạn cũng có thể sử dụng ứng dụng này để chạy các ứng dụng khác. Process.Start("calc.exe");sẽ chạy Máy tính. Bạn có thể truyền cho nó đường dẫn đầy đủ đến một tệp thực thi và nó sẽ chạy nó.
Jamie Penney

1
LOL, vâng, tại sao không. Hài hước, có Application.Run trong đầu tôi, không thể tham gia vào Quá trình phổ biến. Bắt đầu và nghĩ WPF đang chơi game với tôi.
Abel

9
lưu ý: Nó sẽ ném một ngoại lệ nếu nó không ở đó. Hãy thử Process.Start ("explorer", @ "c: \ test"); thay vào đó, nếu bạn không muốn xử lý ngoại lệ. Nó sẽ mở một cửa sổ mặc định. Thường thì sẽ tốt hơn để xử lý ngoại lệ, tuy nhiên.
hợp nhất

9
Xin lưu ý rằng nếu ai đó độc hại (hoặc chỉ không biết) có thể nhận được bất kỳ chuỗi nào ở đó, họ sẽ có thể thực hiện bất kỳ chương trình nào. Đề xuất @amalgamate an toàn hơn, nếu không hãy kiểm tra xem đường dẫn có phải là thư mục không và nếu nó tồn tại trước đó.
Christian Rondeau

3
Một điểm khác biệt giữa Start(dir)Start("explorer.exe", dir)là cái trước sẽ đủ thông minh để tập trung vào cửa sổ hiện có dirnếu có một cái, trong khi cái sau sẽ mở một cửa sổ mới mỗi lần.
dlf

13

Điều này sẽ làm việc:

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

Hoặc nếu bạn muốn một phương thức để chạy chương trình / mở tệp và / hoặc thư mục:

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

    StartInformation.FileName = path;

    Process process = Process.Start(StartInformation);

    process.EnableRaisingEvents = true;
}

Và sau đó gọi phương thức và trong ngoặc đơn đặt thư mục của tệp và / hoặc thư mục ở đó hoặc tên của ứng dụng. Hy vọng điều này sẽ giúp!


12

Bạn có thể sử dụng System.Diagnostics.Process.Start.

Hoặc sử dụng WinApi trực tiếp với một cái gì đó như sau, sẽ khởi chạy explorer.exe. Bạn có thể sử dụng tham số thứ tư cho ShellExecute để cung cấp cho nó một thư mục bắt đầu.

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

Các tuyên bố đến từ trang web pinvoke.net .


1
vâng, tôi đã nhận được lỗi khi theo đuổi điều đó, không biết về <strike> strike </ strike> btw cool
Edward Tanguay

1
trong đó, thật không may, chỉ hoạt động trong câu trả lời / câu hỏi, nhưng không có ý kiến ​​;-). Tôi vừa cập nhật.
Abel

+1 Tôi sẽ sử dụng mã này để khởi chạy các ứng dụng khác, nhưng Process.Start () chính xác là những gì tôi cần.
Edward Tanguay

đó là những gì xảy ra khi bạn cố gắng trả lời q. 3AM: bạn bỏ lỡ điều hiển nhiên ;-). Dù sao, tôi nhớ rằng tôi thường sử dụng ShellExecute khi Process.Start không như tôi muốn (có một vài tình huống không thể xử lý).
Abel

những gì bạn (trong hai câu đầu tiên), cho biết sẽ hoạt động từ một ứng dụng winforms, Application.Run ("explorer.exe") không hoạt động. Bởi vì application.run thậm chí không lấy một chuỗi
barlop

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

Tôi đã phải sử dụng cái này, một cách khác là chỉ định tgt dir sẽ đóng cửa sổ explorer khi ứng dụng của tôi chấm dứt.


Câu trả lời duy nhất tôi không nhận được Access deniedngoại lệ.
Matas Vaitkevicius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.