Obtener ruta de carpeta actual


222

Quiero crear un programa que convierta archivos. Me gustaría que el usuario pueda colocar el archivo ejecutable en cualquier directorio, y al ejecutar ese programa (haciendo doble clic en el .exe) quiero que el programa procese todos los archivos dentro de la carpeta actual donde existe el archivo exe . ¿Cómo puede el programa determinar la ruta en la que se está ejecutando actualmente?

Lo intenté System.Windows.Forms.Application.StartupPathpero parece ser el camino equivocado.

¿Algunas ideas?

Respuestas:


334

Usted debe no utilizar Directory.GetCurrentDirectory(), en su caso, como el directorio actual puede diferir de la carpeta de ejecución, especialmente cuando se ejecuta el programa a través de un acceso directo.

Es mejor usarlo Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);para su propósito. Esto devuelve el nombre de ruta donde reside el ensamblaje actualmente en ejecución.

Si bien mi enfoque sugerido le permite diferenciar entre el ensamblaje ejecutor, el ensamblaje de entrada o cualquier otro ensamblado cargado, como dijo Soner Gönül en su respuesta,

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

También puede ser suficiente. Esto sería igual a

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly () y GetExecutingAssembly () tiene una diferencia interesante. Para más detalles, consulte stackoverflow.com/a/18562036/30289
bhadra

3
Como dije: Esto devuelve el nombre de ruta donde reside el ensamblaje actualmente en ejecución . La diferencia entre GetEntryAssemblyy GetExecutingAssemblyno es una gran sorpresa, también es obvia por el nombre de la función. Si hicieron lo mismo, ¿por qué debería haber dos funciones? :-)
Thorsten Dittmar

2
+1 Assembly.GetEntryAssembly () me ayudó en caso de ejecutar la aplicación a través de clickonce
Artiom

99
Esto está en System.Reflection, así System.Reflection.Assembly.GetExecutingAssembly().Locationes el completo, si está probando desde la ventana Inmediato
The Red Pea

147
System.AppDomain.CurrentDomain.BaseDirectory

Esto le dará el directorio en ejecución de su aplicación. Esto incluso funciona para aplicaciones web. Luego puede llegar a su archivo.


99
Esta es la propiedad más precisa para usar para este propósito. BaseDirectory de CurrentDomain siempre apuntará a la ubicación correcta, incluso si AppDomain se crea dinámicamente para buscar los ensamblajes desde una ubicación diferente.
dhruvin

Perfecto. Esto funciona de forma independiente para cualquier aplicación, especialmente cuando se utiliza Streamreader, que puede leer diferentes rutas absolutas según el tipo de aplicación.
user3326078

40

Creé una aplicación de consola simple con el siguiente código:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

Copié el ejecutable resultante en C:\temp2. Luego coloqué un acceso directo a ese ejecutable C:\temp3y lo ejecuté (una vez desde el propio exe y otra desde el acceso directo). Dio las siguientes salidas en ambas ocasiones:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

Si bien estoy seguro de que debe haber alguna razón para explicar por qué hay cinco métodos diferentes que hacen exactamente lo mismo, ciertamente no sé qué es. Sin embargo, parecería que, en la mayoría de las circunstancias, usted es libre de elegir el que desee.

ACTUALIZACIÓN: Modifiqué las propiedades de acceso directo, cambiando el campo "Iniciar en:" a C:\temp3. Esto dio como resultado el siguiente resultado:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... que demuestra al menos algunas de las distinciones entre los diferentes métodos.


2
Muchas gracias.
baj9032

Una nota importante El directorio de trabajo no siempre será el mismo que el directorio instalado.
Jordania


21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

De Path.GetDirectoryName

Devuelve la información del directorio para la cadena de ruta especificada.

De Application.ExecutablePath

Obtiene la ruta del archivo ejecutable que inició la aplicación, incluido el nombre del ejecutable.


19

Utilizar este,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

Puedes usar esto también.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

9

para uso .NET CORESystem.AppContext.BaseDirectory

(como reemplazo de AppDomain.CurrentDomain.BaseDirectory)


6

1)

Directory.GetCurrentDirectory();

2)

Thread.GetDomain().BaseDirectory

3)

Environment.CurrentDirectory

Environment.CurrentDirectoryse puede cambiar de varias maneras ... (configuración de shotrtcut, etc.)
Yousha Aleayoub


0

Si quieres la ruta exe puedes usar System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

Esto funciona mejor para mí, especialmente cuando utilizo la publicación de archivos únicos de dotnet core. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.