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?

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

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.


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.


2
Dziękuję Ci bardzo.
baj9032

Ważna uwaga. Katalog roboczy nie zawsze będzie taki sam jak katalog zainstalowany.
Jordan



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

9

do użytku .NET CORESystem.AppContext.BaseDirectory

(jako zamiennik AppDomain.CurrentDomain.BaseDirectory)


6

1.

Directory.GetCurrentDirectory();

2)

Thread.GetDomain().BaseDirectory

3)

Environment.CurrentDirectory

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


0

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.