2009-06-02 17 views

Respuesta

280

Un método:

System.AppDomain.CurrentDomain.BaseDirectory 

Otra manera de hacerlo sería:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName) 
+0

Ah, gracias. Debe haber pasado por alto AppDomain de alguna manera. Lo estaba buscando, en realidad ... – Joey

+0

No parece estar disponible en VS.Net 2010/WPF 4 – AndyD273

+0

@ AndyD273: Funciona para mí. ¿Te falta una directiva 'using' o una referencia de ensamblado? – Helen

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName; 
string dir = Path.GetDirectoryName(exePath); 

¡Pruebe esto!

+0

No es bonito, pero funciona. Gracias :-) – Joey

24

Aquí hay otro:

System.Reflection.Assembly.GetExecutingAssembly().Location 
+1

Éste obtiene la ubicación después de _shadow-copiar_, como se indica [en los documentos] (http: // msdn.microsoft.com/en-us/library/system.reflection.assembly.location.aspx). De hecho, no estoy seguro de si las sugerencias en la respuesta aceptada se ven afectadas por la copia oculta. –

+2

Esto me dio el subdirectorio de la DLL que estaba llamando, no el directorio principal del programa. – strattonn

7

Puede también utilizar el primer argumento del comando argumentos de línea:

String exePath = System.Environment.GetCommandLineArgs()[0]

+0

Sin embargo, tenga en cuenta que una aplicación "malvada" puede modificar sus argumentos de línea de comandos. –

+0

@Daniel: ¿Por qué se lo haría a sí mismo? ¿O te refieres a una aplicación diferente? –

+1

@Merlyn: ver http://blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Citaré: es un "parámetro convenientemente inicializado para el código de inicio del proceso". Entonces puede modificar deliberada o inadvertidamente esa ubicación de memoria. –

0

También puede utilizar libremente Application.StartupPath desde System.Windows.Forms, pero debe agregar la referencia para el ensamblado System.Windows.Forms.

3

Pruebe esto. No se olvide using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
1

He usado simplemente string baseDir = Environment.CurrentDirectory; y su trabajo es para mí.

buena suerte

Editar:

que utiliza para eliminar este tipo de error, pero yo prefiero editarlo porque creo que el punto negativo de esta respuesta ayudar a la gente a saber sobre manera incorrecta. :) comprendí la solución anterior no es útil y lo cambié a string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Otras formas de conseguirlo son:

1. string baseDir = 
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
2. String exePath = System.Environment.GetCommandLineArgs()[0]; 
3. string appBaseDir = System.IO.Path.GetDirectoryName 
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); 

buena suerte

+3

Ese es el directorio de trabajo actual. * Puede * coincidir con el directorio de la aplicación, pero esos son conceptos separados (y lo más importante, el directorio de trabajo puede cambiar, por ejemplo, si tuviera abierto un cuadro de diálogo de archivo común). – Joey

+1

@joey tienes razón. Lo cambié por esto: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Gracias. – QMaster

0

He intentado esto:

label1.Content = Directory.GetCurrentDirectory(); 

y consigo también el directorio.

+0

Esto obtiene el directorio de trabajo actual, que puede ser diferente del directorio de proceso. – Thraka

+0

Supongo que tengo que evaluar Directory.GetCurrentDirectory(); Más. Gracias @Traka por la corrección. – paul

Cuestiones relacionadas