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");
Daniel
fuente
¿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
Fredrik Mörk
fuente
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.

OregonGhost
fuente
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");
Scsion
fuente
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 \

Kevin Laity
fuente
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");
Joel Coehoorn
fuente
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.

Leonardo Maxson
fuente
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.

Jeremy Cron
fuente
1

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

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
Austin Salonen
fuente
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.

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

Nueva abeja
fuente
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?

sgmoore
fuente
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");
}
}
schar
fuente
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

Curtis
fuente
0

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

Simplemente cambie la ruta o declare en un string

Gaurav Bari
fuente