Как открыть проводник 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 закрыл бы окно проводника, когда мое приложение завершилось.

MarkyMarksFunkyBunch
источник
Единственный ответ, я не получаю Access deniedисключения.
Матас Вайткявичюс