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

Nathan Baulch
źródło
@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.

JaredPar
źródło
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.

Albert
źródło
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;   
Dalorzo
źródło
6

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

Joel Coehoorn
źródło
2

Zwykle używam czegoś takiego:

            string AppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            AppPath = AppPath.Replace("file:\\", "");
Zahymaka
źródło
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

hud
źródło