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

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

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

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

person Edward Tanguay    schedule 17.11.2009    source источник


Ответы (4)


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

person Jamie Penney    schedule 17.11.2009
comment
Примечание. Вы также можете использовать это для запуска других приложений. Process.Start("calc.exe"); запустит калькулятор. Вы можете передать ему полный путь к исполняемому файлу, и он запустит его. - person Jamie Penney; 17.11.2009
comment
LOL, да, а почему бы и нет. Забавно, у меня в голове был Application.Run, я не мог добраться до вездесущего Process.Start и думал, что WPF играет со мной в игры. - person Abel; 17.11.2009
comment
Это помогло мне, когда я пытался загрузить проводник и добавить папку в качестве рабочего каталога с помощью process.start. Спасибо за ответ. - person Michael Eakins; 28.09.2012
comment
примечание: если его нет, будет выдано исключение. Попробуйте Process.Start (explorer, @c: \ test); вместо этого, если вы не хотите обрабатывать исключение. Откроется окно по умолчанию. Однако часто бывает лучше обработать исключение. - person amalgamate; 16.09.2013
comment
Помните, что если кто-то злонамеренный (или просто не подозревающий) может получить там любую строку, он сможет выполнить любую программу. Предложение @amalgamate более безопасно, в противном случае проверьте, является ли путь каталогом и существовал ли он раньше. - person Christian Rondeau; 02.09.2014
comment
Потому что это не работает. Это просто запускает фоновый процесс на сервере интрасети. Мы хотим, чтобы для пользователя на его машине открывалось фактическое окно, чтобы ему не приходилось постоянно перемещаться по нему. - person VoidKing; 05.09.2017
comment
Еще одно различие между Start(dir) и Start("explorer.exe", dir) состоит в том, что первый будет достаточно умен, чтобы сфокусировать существующее окно для dir, если оно есть, а последнее каждый раз открывает новое окно. - person dlf; 23.05.2018
comment
Не работает. Я получаю исключение "Доступ запрещен". Ответ ниже Process.Start (explorer.exe, @C: \ Users); работает отлично. - person AH.; 22.10.2020

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

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

person MarkyMarksFunkyBunch    schedule 05.06.2018
comment
Единственный ответ Я не получаю Access denied исключение. - person Matas Vaitkevicius; 04.05.2020
comment
Это отлично работает без исключения отказа в доступе. Спасибо. - person AH.; 22.10.2020

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

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

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

person Anthony Smyth    schedule 19.06.2015
comment
Открытие папки. Ошибка в строке process.EnableRaisingEvents = true;, потому что процесс равен нулю. - person Starwave; 18.01.2021

Вы можете использовать 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.

person Abel    schedule 17.11.2009
comment
да, я получал ошибки, преследуя это, не знал о забастовке ‹strike› ‹/strike› кстати круто - person Edward Tanguay; 17.11.2009
comment
который, к сожалению, работает только в ответах / вопросах, но не в комментариях ;-). Я только что обновился. - person Abel; 17.11.2009
comment
+1 Я буду использовать этот код для запуска других приложений, но Process.Start () был именно тем, что мне было нужно. - person Edward Tanguay; 17.11.2009
comment
вот что происходит, когда вы пытаетесь ответить на вопрос. 3 часа ночи: вы упускаете очевидное ;-). В любом случае, я помню, что часто использую ShellExecute, когда Process.Start не то, что мне нужно (есть несколько сценариев, с которыми он не может справиться). - person Abel; 17.11.2009
comment
то, что вы (в первых двух предложениях) сказали, будет работать из приложения winforms, Application.Run (explorer.exe) не работает. Поскольку application.run даже не принимает строку - person barlop; 06.05.2016
comment
из-за использования неуправляемых ресурсов должен ли я заключить это использование в другой класс, реализующий IDisposable? - person LuckyLikey; 27.06.2017
comment
@LuckyLikey, да, обычно это хорошая идея и хороший дизайн. - person Abel; 28.06.2017