La mejor forma 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 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 es probablemente lo que generalmente 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 de 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, vea la respuesta de @Vimvq1987.

CodeBase es el lugar donde se encontró un archivo y puede ser una URL que comienza con http: //. En este caso, la Location probablemente será la caché de descarga del ensamblado. No se garantiza que CodeBase esté configurado para ensamblados en el GAC .

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 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 aplica para 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).

  1. Application.StartupPath y 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) : solo 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á ejecutando.

  3. AppDomain.CurrentDomain.BaseDirectory para la aplicación web podría ser útil y devolverá algo así 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 indicará dónde se desencadenó 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"

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

obtendrá su ubicación donde está ejecutando el código .dll , 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 de la aplicación de consola 2-6 serán el directorio donde está el archivo .exe .

Espero que esto te ahorre algo de tiempo.

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; 

Arriba de la descripción del código

Inicié un proceso de un Servicio de Windows sobre la API de Win32 en la sesión del usuario que realmente está conectado (en la sesión 1 del Administrador de tareas no en 0). En este fue que 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 

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

este “System.IO.Path.GetDirectory (Application.ExecutablePath)” cambió a System.IO.Path.GetDirectoryName (Application.ExecutablePath)

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 Click de botón: btn_OpenFile_Click()

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

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

Entonces, al poner "\\.." esto, puede ir al directorio superior.

Lo he usado con éxito

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

Funciona incluso dentro de linqpad.