Як я можу відкрити Провідник 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якщо воно є, а друге відкриває нове вікно кожен раз.
dlf

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 безпосередньо з чимось подібним, що запустить explor.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> btw cool
Edward Tanguay

1
який, на жаль, працює лише у відповідях / запитаннях, але не у коментарях ;-). Я щойно оновив.
Авель

+1 Я буду використовувати цей код для запуску інших додатків, але Process.Start () був саме тим, що мені потрібно.
Edward Tanguay

ось що відбувається, коли ви намагаєтесь відповісти на питання q. 3:00: ви пропускаєте очевидне ;-). У будь-якому випадку, я пам'ятаю, я часто використовую ShellExecute, коли Process.Start робить не те, що я хочу (є кілька сценаріїв, з якими він не може впоратися).
Абель

те, що ви (у перших двох реченнях) сказали, працює з додатком winforms, Application.Run ("explorer.exe") не працює. Тому що application.run навіть не бере строку
барлоп

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

Мені довелося скористатися цим, інший спосіб просто вказати tgt dir закрив би вікно провідника, коли мою програму припинили.


Єдина відповідь, я не отримую Access deniedвинятку.
Матас Вайткевічус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.