¿Cómo puedo abrir Windows Explorer en un directorio determinado desde una aplicación WPF?


150

En una aplicación WPF, cuando un usuario hace clic en un botón que quiero abrir el explorador de Windows en un directorio determinado, ¿cómo hago eso?

Esperaría algo como esto:

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

Respuestas:


306

¿Por qué no Process.Start(@"c:\test");?


9
Nota: También puede usar esto para ejecutar otras aplicaciones. Process.Start("calc.exe");correrá la calculadora. Puede pasarle la ruta completa a un ejecutable y lo ejecutará.
Jamie Penney el

1
LOL, sí, por qué no. Es curioso, tenía una aplicación. Se me pasó por la cabeza, no pude llegar al ubicuo proceso. Comencé y pensé que WPF estaba jugando conmigo.
Abel

9
nota: arrojará una excepción si no está allí. Pruebe Process.Start ("explorer", @ "c: \ test"); en cambio, si no quieres manejar la excepción. Se abrirá una ventana predeterminada. Sin embargo, a menudo será mejor manejar la excepción.
amalgamate

9
Tenga en cuenta que si alguien malintencionado (o simplemente inconsciente) puede obtener alguna cadena allí, podrá ejecutar cualquier programa. La sugerencia de @amalgamate es más segura; de lo contrario, compruebe si la ruta es un directorio y si existe antes.
Christian Rondeau

3
Otra diferencia entre Start(dir)y Start("explorer.exe", dir)es que la primera será lo suficientemente inteligente como para enfocar la ventana existente dirsi hay una, mientras que la segunda abre una nueva ventana cada vez.
dlf

13

Esto debería funcionar:

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

O si desea un método para ejecutar programas / abrir archivos y / o carpetas:

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

    StartInformation.FileName = path;

    Process process = Process.Start(StartInformation);

    process.EnableRaisingEvents = true;
}

Y luego llame al método y entre paréntesis coloque el directorio del archivo y / o la carpeta allí o el nombre de la aplicación. Espero que esto haya ayudado!


12

Puedes usar System.Diagnostics.Process.Start.

O utilice WinApi directamente con algo como lo siguiente, que lanzará explorer.exe. Puede usar el cuarto parámetro para ShellExecute para darle un directorio de inicio.

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

Las declaraciones provienen del sitio web pinvoke.net .


1
Sí, estaba recibiendo errores persiguiendo eso, no sabía sobre <strike> strike </strike> por cierto
Edward Tanguay

1
que, desafortunadamente, solo funciona en respuestas / preguntas, pero no en comentarios ;-). Acabo de actualizar.
Abel el

+1 Usaré este código para iniciar otras aplicaciones, pero Process.Start () fue exactamente lo que necesitaba.
Edward Tanguay

eso es lo que sucede cuando intentas responder q. a las 3AM: te pierdes lo obvio ;-). De todos modos, recuerdo que a menudo uso ShellExecute cuando Process.Start no es lo que quiero (hay algunos escenarios que no puede manejar).
Abel

lo que usted (dentro de las dos primeras oraciones) dijo que funcionaría desde una aplicación winforms, Application.Run ("explorer.exe") no funciona. Porque application.run ni siquiera toma una cadena
barlop

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

Tenía que usar esto, la otra forma de especificar el directorio tgt cerraría la ventana del explorador cuando mi aplicación terminara.


La única respuesta no es la Access deniedexcepción.
Matas Vaitkevicius
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.