Uzyskaj bieżącą ścieżkę folderu

222

Chcę stworzyć program, który konwertuje pliki. Chciałbym, aby użytkownik mógł umieścić plik wykonywalny w dowolnym katalogu, a podczas uruchamiania tego programu (dwukrotne kliknięcie pliku .exe) chcę, aby program przetwarzał wszystkie pliki w bieżącym folderze, w którym istnieje plik exe . W jaki sposób program może określić ścieżkę, w której aktualnie wykonuje?

Próbowałem, System.Windows.Forms.Application.StartupPathale wydaje się to niewłaściwy sposób.

Jakieś pomysły?

użytkownik2214609
źródło

Odpowiedzi:

334

Należy nie używać Directory.GetCurrentDirectory()w przypadku, gdy aktualny katalog może różnić się od folderu wykonawczej, zwłaszcza podczas wykonywania programu poprzez skrót.

Lepiej jest użyć Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);do swojego celu. Zwraca nazwę ścieżki, w której znajduje się aktualnie wykonywany zestaw.

Chociaż moje sugerowane podejście pozwala rozróżnić zestaw wykonujący, zestaw wejściowy lub dowolny inny załadowany zestaw, jak powiedział Soner Gönül w swojej odpowiedzi:

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

może również wystarczyć. To by było równe

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Thorsten Dittmar
źródło
10
GetEntryAssembly () i GetExecutingAssembly () ma interesującą różnicę. Aby uzyskać szczegółowe informacje, patrz stackoverflow.com/a/18562036/30289
Bhadra
3
Jak powiedziałem: Zwraca nazwę ścieżki, w której znajduje się aktualnie wykonywany zestaw . Różnica między niespodzianką GetEntryAssemblyi GetExecutingAssemblynie jest aż tak zaskoczeniem, jest również oczywista po nazwie funkcji. Jeśli zrobili to samo, dlaczego miałyby istnieć dwie funkcje? :-)
Thorsten Dittmar
2
+1 Assembly.GetEntryAssembly () pomógł mi w przypadku uruchomienia aplikacji za pomocą clickonce
Artiom
9
To jest w System.Reflection, więc System.Reflection.Assembly.GetExecutingAssembly().Locationjest kompletne - jeśli
The Red Pea
147
System.AppDomain.CurrentDomain.BaseDirectory

To da ci bieżący katalog twojej aplikacji. Działa to nawet w przypadku aplikacji internetowych. Następnie możesz dotrzeć do pliku.

Hakan
źródło
9
Jest to najdokładniejsza właściwość do wykorzystania w tym celu. Baza danych CurrentDomain będzie zawsze wskazywać prawidłową lokalizację, nawet jeśli AppDomain jest dynamicznie tworzony, aby szukać zestawów z innej lokalizacji.
dhruvin 21.04.15
Idealny. Działa to niezależnie dla dowolnej aplikacji, szczególnie przy użyciu Streamreadera, który może odczytywać różne ścieżki bezwzględne w zależności od typu aplikacji.
user3326078,
40

Utworzyłem prostą aplikację konsoli z następującym kodem:

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

Skopiowałem wynikowy plik wykonywalny do C:\temp2. Następnie umieściłem skrót do tego pliku wykonywalnego C:\temp3i uruchomiłem go (raz z samego pliku exe i raz ze skrótu). Za każdym razem dawał następujące wyniki:

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

Choć jestem pewien, że musi istnieć jakiś powód do wyjaśnienia, dlaczego istnieje pięć różnych metod, które robią praktycznie dokładnie to samo, ale z pewnością nie wiem, co to jest. Niemniej jednak wydaje się, że w większości przypadków masz swobodę wyboru tego, co ci się podoba.

AKTUALIZACJA: Zmodyfikowałem właściwości skrótu, zmieniając pole „Rozpocznij w:” na C:\temp3. Spowodowało to następujące wyniki:

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

... co pokazuje przynajmniej niektóre różnice między różnymi metodami.

kmote
źródło
2
Dziękuję Ci bardzo.
baj9032
Ważna uwaga. Katalog roboczy nie zawsze będzie taki sam jak katalog zainstalowany.
Jordan
24

Spróbuj tego:

System.Environment.CurrentDirectory

Hossein Narimani Rad
źródło
1
Environment.CurrentDirectorymożna zmienić na wiele sposobów ... (ustawienia shotrtcut itp.)
Yousha Aleayoub
21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

Z Path.GetDirectoryName

Zwraca informacje o katalogu dla określonego ciągu ścieżki.

Z Application.ExecutablePath

Pobiera ścieżkę do pliku wykonywalnego, który uruchomił aplikację, w tym nazwę pliku wykonywalnego.

Soner Gönül
źródło
19

Użyj tego,

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

Możesz również tego użyć.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
fnaseer
źródło
9

do użytku .NET CORESystem.AppContext.BaseDirectory

(jako zamiennik AppDomain.CurrentDomain.BaseDirectory)

Yonatan
źródło
6

1.

Directory.GetCurrentDirectory();

2)

Thread.GetDomain().BaseDirectory

3)

Environment.CurrentDirectory
Tomtom
źródło
Environment.CurrentDirectorymożna zmienić na wiele sposobów ... (ustawienia shotrtcut itp.)
Yousha Aleayoub
0

Jeśli chcesz ścieżkę exe, możesz użyć System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

Howard Rothenburg
źródło
0

Działa to dla mnie najlepiej, szczególnie w przypadku publikowania pojedynczego pliku dotnet core. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

Keisha W
źródło