Как открыть проводник Windows для определенного каталога из приложения WPF?


150

В приложении WPF, когда пользователь нажимает кнопку, я хочу открыть проводник Windows для определенного каталога, как мне это сделать?

Я ожидал что-то вроде этого:

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

Ответы:


306

Почему нет Process.Start(@"c:\test");?


9
Примечание. Это можно использовать и для запуска других приложений. Process.Start("calc.exe");запустит калькулятор. Вы можете передать ему полный путь к исполняемому файлу, и он запустит его.
— Джейми Пенни

1
LOL, да, почему бы и нет. Забавно, у меня в голове был Application.Run, я не мог добраться до вездесущего Process.Start и думал, что WPF играет со мной в игры.
— Авель

9
примечание: он выдаст исключение, если его там нет. Попробуйте Process.Start ("explorer", @ "c: \ test"); вместо этого, если вы не хотите обрабатывать исключение. Откроется окно по умолчанию. Тем не менее, часто будет лучше обработать исключение.
— объединение

9
Помните, что если кто-то злоумышленник (или просто не подозревает) может получить любую строку там, он сможет выполнить любую программу. Предложение @amalgamate более безопасно, в противном случае проверьте, является ли путь каталогом и существует ли он раньше.
— Кристиан Рондо

3
Другое различие между Start(dir)и Start("explorer.exe", dir)заключается в том, что первый будет достаточно умен, чтобы сфокусировать существующее окно, dirесли оно есть, а второй каждый раз открывает новое окно.
— 1818 г.

13

Это должно работать:

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

Или, если вам нужен метод для запуска программ / открытия файлов и / или папок:

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

    StartInformation.FileName = path;

    Process process = Process.Start(StartInformation);

    process.EnableRaisingEvents = true;
}

Затем вызовите метод и в скобках укажите либо каталог файла и / или папки, либо имя приложения. Надеюсь, это помогло!


12

Вы можете использовать System.Diagnostics.Process.Start.

Или используйте WinApi напрямую с чем-то вроде следующего, которое запустит explorer.exe. Вы можете использовать четвертый параметр для ShellExecute, чтобы дать ему начальный каталог.

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

Заявления приходят с сайта pinvoke.net .


1
да, я получал ошибки, преследуя это, не знал о <strike> strike </ strike> кстати круто
— Эдвард Тангей

1
который, к сожалению, работает только в ответах / вопросах, но не в комментариях ;-). Я только что обновил.
— Авель

+1 Я буду использовать этот код для запуска других приложений, но Process.Start () был именно тем, что мне было нужно.
— Эдвард Тангей

это то, что происходит, когда вы пытаетесь ответить q. 3 часа ночи: вы упускаете очевидное ;-). Во всяком случае, я помню, что я часто использую ShellExecute, когда Process.Start делает не то, что я хочу (есть несколько сценариев, которые он не может обработать).
— Авель

сказанное вами (в первых двух предложениях) будет работать из приложения winforms, Application.Run ("explorer.exe") не работает. Потому что application.run даже не берет строку
— barlop

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

Я должен был использовать это, другой способ просто указать tgt dir закрыл бы окно проводника, когда мое приложение завершилось.


Единственный ответ, я не получаю Access deniedисключения.
— Матас Вайткявичюс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.