¿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");
Edward Tanguay
fuente

Respuestas:

306

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

Jamie Penney
fuente
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!

Anthony Smyth
fuente
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 .

Abel
fuente
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.

MarkyMarksFunkyBunch
fuente
La única respuesta no es la Access deniedexcepción.
Matas Vaitkevicius