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
¿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 explorerProcess.Start(@"c:\temp");// opens the folder in explorerProcess.Start("explorer.exe",@"c:\temp");// throws exceptionProcess.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:
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.)
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.
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.
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.
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{staticvoidMain(){System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");}}
¿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.
Respuestas:
¿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:
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:
fuente
Process.Start(path)
activa la ventana (solo puede parpadear en la barra de tareas, no se muestra al frente);explorer.exe
El parámetro + abre una nueva ventana siempre en el frente (pero varias veces la misma ventana). Entonces ambos tienen advertencias.Process.Start(@"c:\temp")
debe usarse con precaución. Sic:\temp.com
existe, se abrirá la llamada a la funciónc:\temp.com
. Ver foros.iis.net/p/1239773/2144186.aspx para más detalles.Process.Start(@"c:\temp")
es susceptible de abrir una carpeta diferente comoC:\temp.exe
oC:\temp.cmd
. Vea este problema donde VS mismo exhibe un comportamiento defectuoso . Puede evitar esto utilizando laexplorer.exe
variante o (mejor, IMO) siempre agregando aPath.DirectorySeparatorChar
. Por ejemplo,Process.Start(@"C:\temp\")
.Solo para completar, si todo lo que desea hacer es abrir una carpeta, use esto:
Asegúrese de que FileName finalice
Path.DirectorySeparatorChar
para 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.
fuente
C:\teste.exe
oC:\teste.cmd
existe, Explorer se abrirá en esa otra carpeta en lugar de la que deseaba. Para evitar esto, puede agregar unPath.DirectorySeparatorChar
a la ruta. Vea cómo VS mismo comete el mismo error .Verb = "select"
, pero lamentablemente no puedes. De todos modos, gran respuesta!Verb = "open"
no fue necesaria. (Probado en Windows, otros sistemas operativos pueden diferir.).Verbs
propiedad enProcessStartInfo
( docs.microsoft.com/en-us/dotnet/api/… )Si desea seleccionar el archivo o la carpeta, puede usar lo siguiente:
fuente
/select
a/open
Estás utilizando el símbolo @, que elimina la necesidad de escapar de las barras diagonales inversas.
Elimine la @ o reemplace \\ con \
fuente
No necesita la doble barra invertida cuando utiliza cadenas sin escape:
fuente
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.fuente
Path.DirectorySeparatorChar
. De lo contrario, si también existe una carpeta con el mismo nombre pero.cmd
/.exe
o 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.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.
fuente
Estás escapando de la barra invertida cuando el signo at lo hace por ti.
fuente
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.
fuente
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.
fuente
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?
fuente
¿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
fuente
¿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
fuente
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
Simplemente cambie la ruta o declare en un
string
fuente