Abra una carpeta usando Process.Start


148

Vi el otro tema y estoy teniendo otro problema. El proceso está comenzando (vi en el administrador de tareas) pero la carpeta no se abre en mi pantalla. Que pasa

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

¿Estás seguro de que tu camino es correcto?
Nathan Koop el

1
¿Por qué quieres llamar a Explorer manualmente? ¿Por qué no simplemente abrir la carpeta, es decir, llamar a Process.Start con ProcessStartInfo con UseShellExecute establecido en verdadero y Verbo establecido en "abrir"?
OregonGhost

1
Sí, intenté abrir 'explorer.exe' sin la ruta y tampoco funcionó.
Daniel

Bueno, no publiqué porque la pregunta no es cómo abrir una carpeta, sino cómo ejecutar explorer.exe para abrir una carpeta. Solo quería saber por qué quieres invocar al explorador directamente en primer lugar, porque podría haber una razón;)
OregonGhost

Solo quiero excluir las opciones aquí, así que esta puede ser una pregunta estúpida: no estás haciendo esto en Linux usando mono, ¿verdad? ¿Estamos hablando de un entorno Windows?
Fredrik Mörk el

Respuestas:


266

¿Se ha asegurado de que la carpeta " c:\teste" existe? Si no es así, el explorador se abrirá mostrando alguna carpeta predeterminada (en mi caso " C:\Users\[user name]\Documents").

Actualizar

He intentado las siguientes variaciones:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

Si ninguno de estos (bueno, excepto el que arroja una excepción) funciona en su computadora, no creo que el problema radique en el código, sino en el entorno. Si ese es el caso, probaría uno (o ambos) de los siguientes:

  • Abra el cuadro de diálogo Ejecutar, ingrese "explorer.exe" y presione enter
  • Abra un símbolo del sistema, escriba "explorer.exe" y presione enter

Bueno, estoy seguro y si no existiera, ¿abriría cualquier carpeta de la misma manera o no?
Daniel

Bueno, entonces podría ser un problema del entorno. Abrí explorer.exe a través de cmd y abrí normal. Ninguno de los Procesos. Inicio funcionó excepto 'Process.Start (@ "c: \ does_not_exist");' eso arrojó una excepción
Daniel

1
Pequeña diferencia si esa ventana del explorador ya está abierta: Process.Start(path) activa la ventana (solo puede parpadear en la barra de tareas, no se muestra al frente); explorer.exeEl parámetro + abre una nueva ventana siempre en el frente (pero varias veces la misma ventana). Entonces ambos tienen advertencias.
KekuSemau

Process.Start(@"c:\temp")debe usarse con precaución. Si c:\temp.comexiste, se abrirá la llamada a la función c:\temp.com. Ver foros.iis.net/p/1239773/2144186.aspx para más detalles.
Lex Li el

Tenga en cuenta que Process.Start(@"c:\temp")es susceptible de abrir una carpeta diferente como C:\temp.exeo C:\temp.cmd. Vea este problema donde VS mismo exhibe un comportamiento defectuoso . Puede evitar esto utilizando la explorer.exevariante o (mejor, IMO) siempre agregando a Path.DirectorySeparatorChar. Por ejemplo, Process.Start(@"C:\temp\").
binki

46

Solo para completar, si todo lo que desea hacer es abrir una carpeta, use esto:

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

Asegúrese de que FileName finalice Path.DirectorySeparatorCharpara que señale sin ambigüedad a una carpeta. (Gracias a @binki.)

Esta solución no funcionará para abrir una carpeta y seleccionar un elemento, ya que no parece un verbo para eso.


Esto funciona para mí, tanto en Windows como en Linux usando Mono.
Menno Deij - van Rijswijk

1
Si utiliza este método y una carpeta como C:\teste.exeo C:\teste.cmdexiste, Explorer se abrirá en esa otra carpeta en lugar de la que deseaba. Para evitar esto, puede agregar un Path.DirectorySeparatorChara la ruta. Vea cómo VS mismo comete el mismo error .
binki

Dada la respuesta de @ Scyssion usando "/ select", pensarías que podrías usar Verb = "select", pero lamentablemente no puedes. De todos modos, gran respuesta!
idbrii

1
Esto funciona para mí en .NET Core 3, a diferencia de la respuesta aceptada anteriormente. La configuración Verb = "open"no fue necesaria. (Probado en Windows, otros sistemas operativos pueden diferir.)
Walt D

Puede obtener los verbos aplicables de la .Verbspropiedad en ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/… )
GaryNg

16

Si desea seleccionar el archivo o la carpeta, puede usar lo siguiente:

Process.Start("explorer.exe", "/select, c:\\teste");

2
Para abrir una carpeta en lugar de seleccionarla, simplemente cambie /selecta/open
SushiGuy

5

Estás utilizando el símbolo @, que elimina la necesidad de escapar de las barras diagonales inversas.

Elimine la @ o reemplace \\ con \


Todavía no abro la carpeta. Solo se inicia el proceso @ task manager
Daniel

No tengo más sugerencias, pude probar y hacerlo funcionar en Visual C # express 2008
Kevin Laity el

1
Yo diría ... cebras. Hay algo mal con su explorador, tal vez virii o algo así ...
R. Martinho Fernandes el

4

No necesita la doble barra invertida cuando utiliza cadenas sin escape:

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

3

Debe usar una de las System.Diagnostics.Process.Start()sobrecargas. ¡Es bastante simple!

Si no coloca el nombre de archivo del proceso que desea ejecutar ( explorer.exe), el sistema lo reconocerá como una ruta de carpeta válida e intentará adjuntarlo al proceso del Explorador que ya se está ejecutando. En este caso, si la carpeta ya está abierta, Explorer no hará nada.

Si coloca el nombre de archivo del proceso (como lo hizo), el sistema intentará ejecutar una nueva instancia del proceso, pasando la segunda cadena como parámetro. Si la cadena es una carpeta válida, se abre en el proceso recién creado, de lo contrario, el nuevo proceso no hará nada.

No sé cómo el proceso trata las rutas de carpetas no válidas en ningún caso. Usar System.IO.Directory.Exists()debería ser suficiente para asegurar eso.


No olvides que necesitas agregar a Path.DirectorySeparatorChar. De lo contrario, si también existe una carpeta con el mismo nombre pero .cmd/ .exeo posiblemente otros sufijos, Explorer se abrirá en esa otra carpeta, o si en realidad son ejecutables o scripts, los ejecutará en lugar de abrir la carpeta como deseaba.
binki

1

Use una versión sobrecargada del método que toma una instancia de ProcessStartInfo y establezca la propiedad ProcessWindowStyle en un valor que funcione para usted.


1

Estás escapando de la barra invertida cuando el signo at lo hace por ti.

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

Este código funciona bien desde el entorno VS2010 y abre la carpeta local correctamente, pero si aloja la misma aplicación en IIS e intenta abrir, entonces fallará con seguridad.


1

Acabo de tener este problema y descubrí por qué. mi razón no aparece aquí, así que cualquier otra persona que tenga este problema y ninguno de estos lo solucione.

Si ejecuta Visual Studio como otro usuario e intenta usar Process.Start, se ejecutará en el contexto de ese usuario y no lo verá en su pantalla.


0

Extraño.

Si no puede encontrar explorer.exe, debería obtener una excepción. Si no puede encontrar la carpeta, aún debería abrir alguna carpeta (por ejemplo, mis documentos)

Dice que aparece otra copia del Explorador en el administrador de tareas, pero no puede verla.

¿Es posible que se esté abriendo fuera de la pantalla (es decir, otro monitor)?

¿O por casualidad estás haciendo esto en un servicio no interactivo?


Solo tengo 1 monitor y "Dices que aparece otra copia de Explorer en el administrador de tareas, pero no puedes verlo". esto es correcto ... No sé a qué te referías "¿O por casualidad estás haciendo esto en un servicio no interactivo?"
Daniel

Me refería a que si el programa que está escribiendo es un servicio (que por defecto se ejecuta completamente en segundo plano) en lugar de un programa winforms normal. (Si no sabe qué es un servicio, es poco probable que esté escribiendo uno). Volviendo al administrador de tareas, si selecciona 'cambiar a', 'traer al frente' o 'maximizar' en esta ventana oculta del explorador, ¿aparece?
sgmoore

0

¿Se abre correctamente cuando ejecuta "explorer.exe c: \ teste" desde su menú de inicio? ¿Cuánto tiempo has estado intentando esto? Veo un comportamiento similar cuando mi máquina tiene muchos procesos y cuando abro un nuevo proceso (los conjuntos dicen IE) ... comienza en el administrador de tareas pero no aparece en el front-end. ¿Has intentado reiniciar?

El siguiente código debería abrir una nueva instancia de explorador

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

¿Tiene muchas aplicaciones ejecutándose cuando intenta esto? A veces encuentro un comportamiento extraño en el trabajo porque mi sistema se queda sin controladores GDI ya que tengo muchas ventanas abiertas (nuestras aplicaciones usan mucho).

Cuando esto sucede, las ventanas y los menús contextuales ya no aparecen hasta que cierro algo para liberar algunos identificadores GDI.

El límite predeterminado en XP y Vista es 10000. No es raro que mi DevStudio tenga 1500 identificadores GDI, por lo que si tiene un par de copias de Dev Studio abiertas, puede consumirlas con bastante rapidez. Puede agregar una columna en el Administrador de tareas para ver cuántos identificadores está utilizando cada proceso.

Hay un ajuste de registro que puede hacer para aumentar el límite.

Para obtener más información, consulte http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

Simplemente cambie la ruta o declare en un string

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.