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 manera dependiendo de la situación?
IHostEnvironment.ContentRootPath
, al que se accede a través de unaIHostEnvironment
dependencia inyectada (que contiene otras cosas útiles).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 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.
CodeBase
es el lugar donde se encontró un archivo y puede ser una URL que comienza con http: //. En cuyo casoLocation
probablemente será el caché de descarga del ensamblado. No se garantiza que CodeBase se configure para ensamblados en el GAC .fuente
Path.Combine
lugar. Esto se encargará de la barra diagonal inversa para usted.Application.StartupPath
y 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Solo funcionará para la aplicación 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ás ejecutando.AppDomain.CurrentDomain.BaseDirectory
para 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.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"
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.
fuente
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:
devuelve el
StartupPath
parámetro (se puede establecer cuando se ejecuta la aplicación)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).fuente
GetCurrentDirectory()
, por el amor de correr cosas desde diferentes caminos! :(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:
Descripción del código anterior
fuente
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:
Quizás sea útil para algunos de ustedes, haciendo lo mismo, cuando buscan la mejor variable para su caso.
fuente
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 proyectoEn 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.
fuente
He usado este con éxito
Funciona incluso dentro de linqpad.
fuente
Directorio raíz:
fuente
Si sabe obtener el directorio raíz:
fuente
este
System.IO.Path.GetDirectory(Application.ExecutablePath)
cambió aSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)
fuente