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?

usuario2214609
fuente

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);
Thorsten Dittmar
fuente
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.

hakan
fuente
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.

kmote
fuente
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.

Soner Gönül
fuente
19

Utilizar este,

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

Puedes usar esto también.

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

para uso .NET CORESystem.AppContext.BaseDirectory

(como reemplazo de AppDomain.CurrentDomain.BaseDirectory)

yonatan
fuente
6

1)

Directory.GetCurrentDirectory();

2)

Thread.GetDomain().BaseDirectory

3)

Environment.CurrentDirectory
Tomtom
fuente
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);

Howard Rothenburg
fuente
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).

Keisha W
fuente