La mejor manera de obtener la ruta de la carpeta de la aplicación
Frecuentes
Visto 679,456 veces
578
Veo que hay algunas formas de obtener la ruta de la carpeta de la aplicación:
Application.StartupPath
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
AppDomain.CurrentDomain.BaseDirectory
System.IO.Directory.GetCurrentDirectory()
Environment.CurrentDirectory
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
System.IO.Path.GetDirectory(Application.ExecutablePath)
¿Cuál es la mejor forma según la situación?
10 Respuestas
580
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
105
Application.StartupPath
y 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Solo va a funcionar para Aplicación de Windows FormsSystem.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.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.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"
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
58
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
9
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;
Respondido 19 Jul 15, 12:07
6
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
5
En mi experiencia, la mejor manera es una combinación de estos.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Te dará la carpeta binDirectory.GetCurrentDirectory()
Funciona bien en .Net Core pero no en .Net y le dará el directorio raíz del proyectoSystem.AppContext.BaseDirectory
yAppDomain.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
1
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
0
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
-1
Si sabe obtener el directorio raíz:
string rootPath = Path.GetPathRoot(Application.StartupPath)
Respondido el 04 de enero de 19 a las 06:01
-1
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 c# .net or haz tu propia pregunta.
Por qué tenemos muchas formas de obtener la ruta de la aplicación. Creo que hay una razón para cada forma. - Leo Vo
Hay un error en # 6: debería leer: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath) - BillW
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 - bkwdesign
Ahora tenemos el confiable
IHostEnvironment.ContentRootPath
, se accede a través de un inyectadoIHostEnvironment
dependencia (que contiene otras cosas útiles). - TimoTambién hay
Process.GetCurrentProcess().MainModule.FileName
. - nawfal