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:
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?
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 probablemente sea 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, por ejemplo, la ruta al ejecutable de Excel.
Los demás pueden devolver directorios diferentes 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 caso Location
probablemente será el caché de descarga del ensamblado. No se garantiza que CodeBase esté configurado para ensamblados en el GAC .
ACTUALIZACIÓN
En estos días (.NET Core, .NET Standard 1.3+ o .NET Framework 4.6+) es mejor usar AppContext.BaseDirectory
en lugar de AppDomain.CurrentDomain.BaseDirectory
. Ambos son equivalentes, pero ya no se admiten varios AppDomains .
Application.StartupPath
y 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Sólo funcionará para la aplicación Windows FormsSystem.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
Le dará algo como:
"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"
cuál 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\\"
cuál es el directorio base y es bastante útil.System.IO.Directory.GetCurrentDirectory()
y 5.Environment.CurrentDirectory
obtendrá la ubicación desde donde se activó 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)
obtendrá la ubicación donde .dll
se está ejecutando el código, para la aplicación web que podría ser"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
Ahora, en el caso de, por ejemplo, los puntos 2 a 6 de la aplicación de consola, será el directorio donde .exe
se encuentra el archivo.
Espero que esto te ahorre algo de tiempo.
Tenga en cuenta que no todos estos métodos devolverán el mismo valor. En algunos casos pueden devolver el mismo valor, pero ojo, sus propósitos son diferentes:
Application.StartupPath
devuelve el StartupPath
parámetro (se puede configurar al ejecutar 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é utilizando esto en un archivo DLL, devolverá la ruta donde se está ejecutando el proceso (esto es especialmente cierto en ASP.NET).
Para una aplicación web, para obtener el directorio raíz de la aplicación web actual, generalmente llame a través de la página web para la solicitud entrante actual:
HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
Descripción del código anterior