La mejor manera de obtener la ruta de la carpeta de la aplicación

515

Veo que hay algunas formas de obtener la ruta de la carpeta de la aplicación:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

¿Cuál es la mejor manera dependiendo de la situación?

Leo Vo
fuente
99
¿Por qué tenemos muchas formas de obtener la ruta de la aplicación? Creo que hay una razón para cada camino.
Leo Vo
1
Hay un error en el n. ° 6: debería leer: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
BillW
2
hurra por el n. ° 6, mientras estaba en un proyecto web, no quería la lógica Server.MapPath en mi biblioteca cargada de IoC que no es de naturaleza específica de la web
bkwdesign
1
Ahora tenemos el confiable IHostEnvironment.ContentRootPath, al que se accede a través de una IHostEnvironmentdependencia inyectada (que contiene otras cosas útiles).
Timo

Respuestas:

519

AppDomain.CurrentDomain.BaseDirectory es probablemente el más útil para acceder a archivos cuya ubicación es relativa al directorio de instalación de la aplicación.

En una aplicación ASP.NET, este será el directorio raíz de la aplicación, no la subcarpeta bin, que es probablemente lo que normalmente desea. En una aplicación cliente, será el directorio que contiene el ejecutable principal.

En una aplicación VSTO 2005, será el directorio que contiene los ensamblados administrados VSTO para su aplicación, no, por ejemplo, la ruta al ejecutable de Excel.

Los otros pueden devolver diferentes directorios según su entorno; por ejemplo, consulte la respuesta de @ Vimvq1987.

CodeBasees el lugar donde se encontró un archivo y puede ser una URL que comienza con http: //. En cuyo caso Locationprobablemente será el caché de descarga del ensamblado. No se garantiza que CodeBase se configure para ensamblados en el GAC .

Joe
fuente
2
Cuando se prueba en Windows XP de 32 bits, regresa donde comenzó el acceso directo.
Joshua Son
1
+1 @Joe y para el complemento de nivel de documento VSTO, vea ESTE
3
Tenga en cuenta que esto devuelve una ruta con una barra diagonal inversa al final. Esto me causó problemas al formatear una cadena con el resultado para pasar como un argumento de proceso.
avenmore
19
@avenmore: si está formateando una cadena para construir una ruta, considere usar en su Path.Combinelugar. Esto se encargará de la barra diagonal inversa para usted.
Joe
1
Esto me devuelve la carpeta bin / debug en VS 2017, no el directorio raíz.
SmoveBB
86
  1. Application.StartupPathy 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- Solo funcionará para la aplicación Windows Forms

  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)

    Te va a dar algo como: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"que es donde está la página que estás ejecutando.

  3. AppDomain.CurrentDomain.BaseDirectorypara la aplicación web podría ser útil y devolverá algo como "C:\\hg\\Services\\Services\\Services.Website\\"cuál es el directorio base y es bastante útil.

  4. System.IO.Directory.GetCurrentDirectory() y 5. Environment.CurrentDirectory

obtendrá su ubicación desde donde se disparó el proceso, por lo que para la aplicación web que se ejecuta en modo de depuración desde Visual Studio, algo así como "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

te llevará a donde .dll está ejecutando el código, para la aplicación web que podría ser"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

Ahora, por ejemplo, en la aplicación de consola, los puntos 2-6 serán el directorio donde .exe está el archivo.

Espero que esto te ahorre algo de tiempo.

Matas Vaitkevicius
fuente
2
Bastante seguro de que desear la "carpeta actual" solo es relevante para aplicaciones no web de todos modos ...
Nyerguds
2
Esta es la respuesta.
P.Brian.Mackey
59

Tenga en cuenta que no todos estos métodos devolverán el mismo valor. En algunos casos, pueden devolver el mismo valor, pero tenga cuidado, sus propósitos son diferentes:

Application.StartupPath

devuelve el StartupPathparámetro (se puede establecer cuando se ejecuta la aplicación)

System.IO.Directory.GetCurrentDirectory()

devuelve el directorio actual, que puede o no ser la carpeta donde se encuentra la aplicación. Lo mismo vale para Environment.CurrentDirectory. En caso de que esté usando esto en un archivo DLL, devolverá la ruta de donde se está ejecutando el proceso (esto es especialmente cierto en ASP.NET).

Quan Mai
fuente
77
¡Por favor, por favor no lo use GetCurrentDirectory(), por el amor de correr cosas desde diferentes caminos! :(
kayleeFrye_onDeck
@kayleeFrye_onDeck no mencionaste los motivos de la pregunta anterior.
menos del
10

Para una aplicación web, para obtener el directorio raíz de la aplicación web actual, generalmente llame por página web para la solicitud entrante actual:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Descripción del código anterior

Raj kumar
fuente
6

Comencé un proceso desde un Servicio de Windows a través de la API Win32 en la sesión del usuario que realmente ha iniciado sesión (en la sesión 1 del Administrador de tareas, no en 0). En este caso, podemos llegar a saber qué variable es la mejor.

Para los 7 casos de la pregunta anterior, los siguientes son los resultados:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

Quizás sea útil para algunos de ustedes, haciendo lo mismo, cuando buscan la mejor variable para su caso.

Beetee
fuente
44
Respuesta muy relevante. Mucha gente olvida que "directorio de trabajo"! = "Directorio de programa".
Nyerguds
3

En mi experiencia, la mejor manera es una combinación de estos.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase Te dará la carpeta bin
  2. Directory.GetCurrentDirectory() Funciona bien en .Net Core pero no en .Net y le dará el directorio raíz del proyecto
  3. System.AppContext.BaseDirectoryy AppDomain.CurrentDomain.BaseDirectory funciona bien en .Net pero no en .Net core y le dará el directorio raíz del proyecto

En una biblioteca de clases que se supone debe apuntar a .Net y .Net core, verifico qué marco aloja la biblioteca y elijo una u otra.

Ahmed Mansour
fuente
2

He usado este con éxito

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Funciona incluso dentro de linqpad.

camilohe
fuente
1
falta el soporte de apertura de GetCurrentProcess. por cierto, se evalúa como C: \ Archivos de programa \ dotnet en mi proyecto principal de .net mientras se depura en Visual Studio porque ahí es donde se encuentra
dotnet.exe
1

Directorio raíz:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
Alparslan ŞEN
fuente
1
Esto parece obtener el directorio de trabajo actual, aunque a veces puede ser útil, definitivamente no se garantiza que sea la ruta EXE.
krowe2
0

Si sabe obtener el directorio raíz:

string rootPath = Path.GetPathRoot(Application.StartupPath)
Alparslan ŞEN
fuente
0

este System.IO.Path.GetDirectory(Application.ExecutablePath)cambió aSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)

nazim hatipoglu
fuente