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


Veo que hay algunas maneras 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?

 370
Author: Peter Mortensen, 2011-05-18

8 answers

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 un ASP.NET aplicación, 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, digamos, el ruta al ejecutable de Excel.

Los otros pueden devolver directorios diferentes dependiendo de su entorno - por ejemplo, vea la respuesta de @Vimvq1987.

CodeBase es el lugar donde se encontró un archivo y puede ser una URL que comience con http://. En cuyo caso Location probablemente será la caché de descarga del ensamblado. No se garantiza que la base de código se establezca para ensamblajes en el GAC.

 407
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-19 11:51:55

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 parámetro StartupPath (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 ocurre con Environment.CurrentDirectory. En caso de que esté utilizando esto en un archivo DLL, devolverá la ruta de donde se está ejecutando el proceso (esto es especialmente cierto en ASP.NET).

 50
Author: Vimvq1987,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-19 11:54:01
  1. Application.StartupPathy 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) - Solo va a 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.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

Le dará la ubicación de donde el el proceso se disparó desde-así 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)

Le dará la ubicación 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, en el caso de, por ejemplo, la aplicación de consola, los puntos 2-6 serán el directorio donde se encuentra el archivo .exe.

Espero que esto te ahorre algo de tiempo.

 45
Author: Matas Vaitkevicius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 10:31:13

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

 6
Author: Raj kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-19 11:55:31

Inicié un proceso desde un Servicio de Windows a través de la API Win32 en la sesión del usuario que realmente está conectado (en la sesión del Administrador de tareas 1 no 0). En esto fue que podemos llegar a saber, que 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

Tal vez sea útil para algunos de ustedes, hacer lo mismo, cuando buscan la mejor variable para su caso.

 1
Author: Beetee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-20 19:36:08

Este " System. IO. Path. getDirectory (Application.ExecutablePath)" cambió a System. IO.Path.GetDirectoryName(Application. ExecutablePath)

 0
Author: nazim hatipoglu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-08 20:31:59

Como Ejemplo:

  1. Botón : [ Nombre - 'btn_OpenFile']
  2. Tengo 'abc.exe " que quiero abrir.
  3. Ruta del archivo: C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.

Entonces, haré lo siguiente:

  1. En el evento de clic en el botón: btn_OpenFile_Click()

Process.Start(@Environment.CurrentDirectory+"\\..\\..\\abc.exe");

Nota: "Medio ambiente.CurrentDirectory " devuelve esta ruta: "C:\\Users\\Admin\\Documents\\Visual Studio 2015\\Projects\\MyProject\\MyProject\\bin\\Debug"

Así que, Poniendo "\\.." esto, puedes ir al directorio superior.

 0
Author: Keyur Sureliya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-16 06:49:05

He usado este con éxito

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

Funciona incluso dentro de linqpad.

 0
Author: camilohe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-07 20:02:06