¿Debo usar AppDomain.CurrentDomain.BaseDirectory o System.Environment.CurrentDirectory?

86

Tengo dos archivos exe en la misma carpeta, puedo ejecutar exe2 desde un botón en exe1. Hoy estaba observando a un cliente durante una sesión remota (servicios de terminal) y exe2 no pudo ejecutar el error "Archivo no encontrado", pero exe1 estaba en el mismo directorio cuando lo verificamos. Entonces, ¿debería usar AppDomain.CurrentDomain.BaseDirectory o System.Environment.CurrentDirectory ?

Gracias

Nathan Baulch
fuente
@Jade M ¿Cómo estás ejecutando tu exe1 en la terminal?
Sra. Sonia
Quiero sumar mis dos centavos diciendo que string.GetFullPath(path)usa en Environment.CurrentDirectorylugar de CurrentDomain.BaseDirectory, para mi sorpresa.
JBSnorro

Respuestas:

185

Si desea buscar archivos en el mismo directorio que su aplicación, AppDomain.CurrentDomain.BaseDirectoryes la opción correcta.

Environment.CurrentDirectoryes un valor que puede cambiar y cambiará a lo largo de la ejecución de su aplicación. Por ejemplo, usando parámetros predeterminados, OpenFileDialog en WinForms cambiará este valor al directorio donde se seleccionó el archivo.

JaredPar
fuente
Usé button1 para mostrar OpenFileDialog, luego button2 para mostrar Environment.CurrentDirectory, pero sigo mostrando la carpeta de depuración, ¿por qué?
Lei Yang
18

AppDomain.CurrentDomain.BaseDirectorydevuelve el directorio desde donde se cargó el dominio de la aplicación actual.
System.Environment.CurrentDirectorydevuelve el directorio del sistema actual.
En tu caso AppDomain.CurrentDomain.BaseDirectoryes la mejor solución.

Albert
fuente
1
Para ser claros, System.Environment.CurrentDirectory devuelve el directorio de trabajo actual (específico del proceso) .
Oskar Berggren
14

Deberías usar AppDomain.CurrentDomain.BaseDirectory.

Por ejemplo, en una aplicación de servicios de Windows:

System.Environment.CurrentDirectorydevolverá C: \ Windows \ system32

Mientras

AppDomain.CurrentDomain.BaseDirectory devolverá [ubicación de Application.exe]

Otro factor importante a tener en cuenta es que AppDomain.CurrentDomain.BaseDirectoryes una propiedad de solo lectura, mientras que Environment.CurrentDirectorypuede ser otra cosa si es necesario:

// Change the directory to AppDomain.CurrentDomain.BaseDirectory
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;   
Dalorzo
fuente
6

Según tengo entendido, deberías usar BaseDirectory. CurrentDirectorypodría cambiar a lo largo de la ejecución del programa.

Joel Coehoorn
fuente
2

Normalmente uso algo como:

            string AppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            AppPath = AppPath.Replace("file:\\", "");
Zahymaka
fuente
2

También he pasado por esto hace unos días, ya que estaba usando

Environment.CurrentDirectory

ya que me estaba dando un problema en el servidor de producción pero funcionaba bien con mi servidor local,

Entonces, lo intenté con

System.AppDomain.CurrentDomain.BaseDirectory;

Y funcionó para mí tanto en el Medio Ambiente.

Entonces, como todos ellos han dicho, siempre deberíamos ir con

System.AppDomain.CurrentDomain.BaseDirectory;

mientras busca la ruta en el directorio del dominio actual.

echa un vistazo para más información

No se pudo encontrar una parte del error de ruta en el servidor

hud
fuente