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

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 forma según la situación?

preguntado el 18 de mayo de 11 a las 04:05

Por qué tenemos muchas formas de obtener la ruta de la aplicación. Creo que hay una razón para cada forma. -

Hay un error en # 6: debería leer: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath) -

hurra por el n. ° 6, mientras estoy en un proyecto web, no quería la lógica Server.MapPath en mi biblioteca cargada de IoC que no es de naturaleza web específica -

Ahora tenemos el confiable IHostEnvironment.ContentRootPath, se accede a través de un inyectado IHostEnvironment dependencia (que contiene otras cosas útiles). -

También hay Process.GetCurrentProcess().MainModule.FileName. -

10 Respuestas

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 por VSTO para su aplicación, no, digamos, la ruta al ejecutable de Excel.

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

CodeBase es el lugar donde se encontró un archivo y puede ser una URL que comience con http: //. En ese caso Location probablemente será el caché de descarga de ensamblados. No se garantiza que CodeBase se establezca para ensamblados en el CAG.

ACTUALIZACIÓN En estos días (.NET Core, .NET Standard 1.3+ o .NET Framework 4.6+) es mejor usar AppContext.BaseDirectory más bien que AppDomain.CurrentDomain.BaseDirectory. Ambos son equivalentes, pero varios AppDomains ya no son compatibles.

Respondido el 31 de diciembre de 20 a las 13:12

Cuando se prueba en Windows XP de 32 bits, regresa donde comenzó el acceso directo. - Hijo de Joshua

+1 @Joe y para el complemento de nivel de documento de VSTO, consulte ESTA - usuario2140173

Tenga en cuenta que esto devuelve una ruta con una barra invertida al final. Esto me causó problemas al formatear una cadena con el resultado para pasar como un argumento de proceso. - Avenmore

@avenmore: si está formateando una cadena para construir una ruta, considere usar Path.Combine en lugar de. Esto se encargará de la barra invertida al final por usted. - Joe

Esto me devuelve la carpeta bin / debug en VS 2017, no el directorio raíz. - SmoveBB

  1. Application.StartupPathy 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) - Solo va a funcionar para Aplicación de 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á ejecutando.

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

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

obtendrá la ubicación de 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 como "C:\\Program Files (x86)\\IIS Express"

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

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

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

Espero que esto te ahorre algo de tiempo.

Respondido 08 Feb 17, 10:02

De todos modos, estoy bastante seguro de que querer la "carpeta actual" solo es relevante para aplicaciones que no son web ... - Nyerguds

Esta es la respuesta. - P. Brian Mackey

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 StartupPath parámetro (se puede configurar cuando se ejecuta la aplicación)

System.IO.Directory.GetCurrentDirectory()

devuelve el directorio actual, que puede ser o no la carpeta donde se encuentra la aplicación. Lo mismo va 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).

Respondido 19 Jul 15, 12:07

Por favor, no utilice GetCurrentDirectory(), ¡por el amor de correr cosas desde diferentes caminos! :( - kayleefrye_ondeck

@kayleeFrye_onDeck, no expuso sus razones para la pregunta anterior. - sin

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

Respondido 19 Jul 15, 12:07

Inicié un proceso desde un servicio de Windows a través de la API de Win32 en la sesión del usuario que realmente inició sesión (en la sesión 1 del Administrador de tareas, no 0). En este lugar podemos conocer 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, hacer lo mismo, cuando buscan la mejor variable para su caso.

Respondido 20 Feb 17, 19:02

Respuesta muy relevante. ¡Mucha gente olvida ese "directorio de trabajo"! = "Directorio de programa". - Nyerguds

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.BaseDirectory y 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 que apunta a .Net y .Net core, verifico qué marco aloja la biblioteca y elijo uno u otro.

Respondido el 06 de diciembre de 18 a las 16:12

Re "le dará el directorio raíz del proyecto", No, da el directorio actual, que podría ser por cualquier directorio - Ikegami

He usado este con éxito

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

Funciona incluso por dentro linqpad.

Respondido 07 Feb 18, 20:02

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

Directorio raíz:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

Respondido el 04 de enero de 19 a las 06:01

Esto parece obtener el directorio de trabajo actual, aunque a veces puede ser útil, definitivamente no se garantiza que sea la ruta EXE. - krowe2

Si sabe obtener el directorio raíz:

string rootPath = Path.GetPathRoot(Application.StartupPath)

Respondido el 04 de enero de 19 a las 06:01

esta System.IO.Path.GetDirectory(Application.ExecutablePath) cambiado a System.IO.Path.GetDirectoryName(Application.ExecutablePath)

Respondido el 23 de enero de 20 a las 06:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.