Czy powinienem używać AppDomain.CurrentDomain.BaseDirectory czy System.Environment.CurrentDirectory?


86

Mam dwa pliki exe w tym samym folderze, mogę uruchomić exe2 z przycisku w exe1. Dzisiaj obserwowałem klienta podczas sesji zdalnej (usług terminalowych) i exe2 nie uruchomił błędu „Nie znaleziono pliku”, ale exe1 znajdował się w tym samym katalogu, kiedy sprawdzaliśmy. Czy powinienem więc używać AppDomain.CurrentDomain.BaseDirectory czy System.Environment.CurrentDirectory ?

Dzięki


@Jade M Jak wykonujesz swój exe1 na terminalu?
Pani Sonia,

Chcę dodać moje dwa centy, mówiąc, że string.GetFullPath(path)używa Environment.CurrentDirectoryzamiast CurrentDomain.BaseDirectory, ku mojemu zaskoczeniu.
JBSnorro

Odpowiedzi:


185

Jeśli chcesz znaleźć pliki w tym samym katalogu co Twoja aplikacja, AppDomain.CurrentDomain.BaseDirectoryto właściwy wybór.

Environment.CurrentDirectoryto wartość, która może i będzie się zmieniać w trakcie działania aplikacji. Na przykład, używając parametrów domyślnych, OpenFileDialog w WinForms zmieni tę wartość na katalog, z którego został wybrany plik.


Użyłem button1, aby wyświetlić OpenFileDialog, a następnie button2, aby wyświetlić Environment.CurrentDirectory, ale nadal pokazuję folder debugowania, dlaczego?
Lei Yang

18

AppDomain.CurrentDomain.BaseDirectoryzwraca katalog, z którego została załadowana bieżąca domena aplikacji.
System.Environment.CurrentDirectoryzwraca bieżący katalog systemowy.
W Twoim przypadku AppDomain.CurrentDomain.BaseDirectoryto najlepsze rozwiązanie.


1
Aby było jasne, System.Environment.CurrentDirectory zwraca bieżący (specyficzny dla procesu) katalog roboczy .
Oskar Berggren

14

Powinieneś użyć AppDomain.CurrentDomain.BaseDirectory.

Na przykład w aplikacji usług systemu Windows:

System.Environment.CurrentDirectoryzwróci C: \ Windows \ system32

Podczas

AppDomain.CurrentDomain.BaseDirectory zwróci [lokalizacja Application.exe]

Innym ważnym czynnikiem, na który należy zwrócić uwagę, jest to, że AppDomain.CurrentDomain.BaseDirectoryjest to właściwość tylko do odczytu, podczas gdy w Environment.CurrentDirectoryrazie potrzeby może to być coś innego:

// Change the directory to AppDomain.CurrentDomain.BaseDirectory
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;   

6

Jak rozumiem, powinieneś użyć BaseDirectory. CurrentDirectorymoże się zmieniać w trakcie wykonywania programu.



2

Zwykle używam czegoś takiego:

            string AppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            AppPath = AppPath.Replace("file:\\", "");

2

Przeszedłem też przez te kilka dni wstecz, kiedy używałem

Environment.CurrentDirectory

ponieważ powodował problem na serwerze produkcyjnym, ale działał dobrze z moim serwerem lokalnym,

Więc próbowałem z

System.AppDomain.CurrentDomain.BaseDirectory;

I zadziałało dla mnie zarówno w środowisku.

Tak więc, jak powiedzieli wszyscy z nich, powinniśmy zawsze iść z

System.AppDomain.CurrentDomain.BaseDirectory;

podczas sprawdzania ścieżki w katalogu bieżącej domeny.

poszukaj więcej informacji

Nie można znaleźć części błędu ścieżki na serwerze

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.