Get current folder path
Asked Answered
K

13

350

I want to create a program that converts files. I would like the user to be able to place the executable file in any directory, and when executing that program (double-clicking on the .exe) I want the program to process all the files within the current folder where the exe file exists. How can the program determine the path in which it is currently executing?

I tried System.Windows.Forms.Application.StartupPath but that seems to be the wrong way.

Any ideas?

Kunin answered 27/3, 2013 at 7:45 Comment(0)
S
484

You should not use Directory.GetCurrentDirectory() in your case, as the current directory may differ from the execution folder, especially when you execute the program through a shortcut.

It's better to use Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); for your purpose. This returns the pathname where the currently executing assembly resides.

While my suggested approach allows you to differentiate between the executing assembly, the entry assembly or any other loaded assembly, as Soner Gönül said in his answer,

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

may also be sufficient. This would be equal to

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Spongy answered 27/3, 2013 at 7:47 Comment(5)
GetEntryAssembly() and GetExecutingAssembly() has an interesting difference. For details refer https://mcmap.net/q/88657/-mono-c-get-application-pathJetsam
As I said: This returns the pathname where the currently executing assembly resides. The difference between GetEntryAssembly and GetExecutingAssembly doesn't come as much of a surprise, is also obvious by the function name. If they did the same, why should there be two functions? :-)Spongy
+1 Assembly.GetEntryAssembly() helped me in case of running application via clickonceOctavla
This is in System.Reflection, so System.Reflection.Assembly.GetExecutingAssembly().Location is the complete -- if you're testing from Immediate WindowSulphathiazole
I would also consider Path.GetDirectoryName(Assembly.GetAssembly(typeof(MyClass)).Location). This allows getting the directory for any class desired. Just replace MyClass with a class contained in the assembly you are looking for. Then it will not matter whether it is the entry or executing assembly.Antinode
L
247
System.AppDomain.CurrentDomain.BaseDirectory

This will give you running directory of your application. This even works for web applications. Afterwards you can reach your file.

Lest answered 7/5, 2014 at 9:22 Comment(2)
This is the most accurate property to use for this purpose. The CurrentDomain's BaseDirectory will always point to the correct location even if the AppDomain is dynamically created to look the assemblies from a different location.Colpitis
Perfect. This works independently for any application, especially when using Streamreader, which can read different absolute path's depending on the application type.Mencius
L
70

I created a simple console application with the following code:

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);

I copied the resulting executable to C:\temp2. I then placed a shortcut to that executable in C:\temp3, and ran it (once from the exe itself, and once from the shortcut). It gave the following outputs both times:

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

While I'm sure there must be some cockamamie reason to explain why there are five different methods that do virtually the exact same thing, I certainly don't know what it is. Nevertheless, it would appear that under most circumstances, you are free to choose whichever one you fancy.

UPDATE: I modified the Shortcut properties, changing the "Start In:" field to C:\temp3. This resulted in the following output:

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

...which demonstrates at least some of the distinctions between the different methods.

Leonerd answered 1/9, 2015 at 19:19 Comment(1)
An important note. The working directory is not always going to be the same as the installed directory.Shabbir
B
29

Try this:

System.Environment.CurrentDirectory

Beloved answered 27/3, 2013 at 7:47 Comment(1)
Environment.CurrentDirectory can be changed in a number of ways... (shotrtcut settings, etc)Argil
R
27

Use this,

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

You can use this as well.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Rhodarhodamine answered 27/3, 2013 at 7:47 Comment(0)
H
23
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

From Path.GetDirectoryName

Returns the directory information for the specified path string.

From Application.ExecutablePath

Gets the path for the executable file that started the application, including the executable name.

Hula answered 27/3, 2013 at 7:48 Comment(0)
T
18

for .NET CORE use System.AppContext.BaseDirectory

(as a replacement for AppDomain.CurrentDomain.BaseDirectory)

Tomikotomkiel answered 17/11, 2018 at 20:32 Comment(0)
C
8

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory
Cence answered 27/3, 2013 at 7:50 Comment(1)
Environment.CurrentDirectory can be changed in a number of ways... (shotrtcut settings, etc)Argil
S
2

This works best for me, especially when using dotnet core single file publish. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

Syce answered 17/4, 2020 at 12:14 Comment(0)
R
2

This block of code makes a path of your app directory in string type

string path="";
path=System.AppContext.BaseDirectory;

good luck

Refrigeration answered 7/8, 2020 at 10:22 Comment(0)
C
0

If you want the path of the project folder you also can do this:

        DirectoryInfo di = new DirectoryInfo(".");
       //OR 
        DirectoryInfo di = new DirectoryInfo("../../../");

        Console.WriteLine(di.FullName);

Result: D:\Dev\C#\ProjectFolder\ProjectFolder\

Caitlin answered 6/9, 2022 at 23:39 Comment(0)
D
-1

Use Application.StartupPath for the best result imo.

Dialectologist answered 4/4, 2018 at 18:43 Comment(1)
This is what the OP has tried and rejected.Tombac
R
-1

If you want the exe path you can use System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

Rimester answered 16/1, 2019 at 21:0 Comment(1)
This is what is suggested in the accepted answer posted 6 years prior.Tombac

© 2022 - 2024 — McMap. All rights reserved.