Pobieranie katalogu aplikacji z aplikacji WPF


170

Znalazłem rozwiązania dla Windows Forms z AppDomain, ale jaki byłby odpowiednik Applicationobiektu WPF ?

Odpowiedzi:


329

Jedna metoda:

System.AppDomain.CurrentDomain.BaseDirectory

Innym sposobem na zrobienie tego byłoby:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

Ach, dzięki. Musiał jakoś przeoczyć AppDomain. Szukałem tego, właściwie ...
Joey

3
@Helen: Sądząc po pozytywnych opiniach, jest to oczywiście doskonała odpowiedź. Jednak odpowiedź ma dwa sposoby na uzyskanie katalogu aplikacji. Czy oba będą działać równie dobrze?
Christoffer Lette

21
Skorzystałbym z pierwszej alternatywy. Wygląda na prostszą, nie ma wywołania metody i powoduje mniej wątpliwości co do tego, co faktycznie robi linia podczas czytania.
Filip

3
Użyłem pierwszej metody w usłudze WCF, w aplikacji WPF oraz w projekcie biblioteki klas i wszystko działało dobrze.
Apostrofix

1
Dla NetCore i NetStandard polecałbym drugą, ponieważ AppDomain została dodana w 2.0 i nie zawsze można ją było ustawić zgodnie z oczekiwaniami
cdie

28

Oto kolejny:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
Ten pobiera lokalizację po skopiowaniu w tle , zgodnie z dokumentacją . Właściwie nie jestem pewien, czy kopiowanie w tle ma wpływ na sugestie w zaakceptowanej odpowiedzi.
Christoffer Lette,

2
To dało mi podkatalog biblioteki DLL, którą dzwoniłem, a nie główny katalog programu.
strattonn

7

Możesz także użyć pierwszego argumentu argumentów wiersza poleceń:

String exePath = System.Environment.GetCommandLineArgs()[0]


1
Należy jednak zauważyć, że „zła” aplikacja może modyfikować argumenty wiersza poleceń.
Daniel Rose

@Daniel: Dlaczego miałby to sobie zrobić? Czy masz na myśli inną aplikację?
Merlyn Morgan-Graham

1
@Merlyn: Zobacz blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Zacytuję: jest to „wygodnie zainicjowany parametr kodu startowego procesu”. Możesz więc celowo lub nieumyślnie zmodyfikować tę lokalizację pamięci.
Daniel Rose,

1
@Daniel: Kto może? Inny proces czy ten sam proces? Jeśli strzelisz sobie w stopę, powinno być łatwo wytropić. Nazwałbym to mniej złym, a głupszym :) Jeśli inny proces może to zrobić, to jest to bardziej interesujące. Edycja: nie widzę nic w tym artykule na temat modyfikowania wiersza poleceń uruchomionego programu - tylko to, że proces uruchamiania przekazuje go (nie jestem pewien, czy proces uruchamiania jest niepożądany, aby proces uruchamiania zmieniał wiersz poleceń) i że można go zapytać przez WMI.
Merlyn Morgan-Graham

@ MerlynMorgan-Graham złośliwa aplikacja może zmodyfikować adres pamięci i zmusić aplikację do uruchomienia innej złośliwej aplikacji. To jest złe, ponieważ powiedzmy, że ich aplikacja jest keyloggerem i chcą, aby aktywował się, gdy tylko otworzysz specjalną aplikację. Więc w swoim kodzie przechwycą nazwę twojej aplikacji, uruchomią swój keylogger w tle, a następnie uruchomią twoją aplikację. Użytkownik nie będzie miał pojęcia. Artykuł wyjaśnia to, ale nie mówi, jak to zrobić. Może tego właśnie szukałeś?
pqsk

6

Użyłem po prostu string baseDir = Environment.CurrentDirectory;i to działa dla mnie.

Powodzenia

Edytować:

Kiedyś usuwałem ten typ błędu, ale wolę go edytować, ponieważ myślę, że minus w tej odpowiedzi pomaga ludziom dowiedzieć się o złym sposobie. :) Zrozumiałem, że powyższe rozwiązanie nie jest przydatne i zmieniłem je na string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Inne sposoby, aby je uzyskać:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

Powodzenia


3
To jest bieżący katalog roboczy. Może się to wiązać z katalogiem aplikacji, ale są to osobne pojęcia (a co najważniejsze, katalog roboczy może się zmienić, np. Jeśli masz otwarte wspólne okno dialogowe pliku).
Joey

1
@joey masz rację. Zmieniłem to na to: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Dzięki.
QMaster

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Spróbuj tego!


3

Spróbuj tego. Nie zapomnij using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

Próbowałem tego:

    label1.Content = Directory.GetCurrentDirectory();

i pobierz także katalog.


Pobiera bieżący katalog roboczy, który może różnić się od katalogu procesu.
Thraka

Chyba muszę ocenić Directory.GetCurrentDirectory (); więcej. Dziękuję @Thraka za poprawkę.
paul

0

Możesz również swobodnie używać Application.StartupPath z System.Windows.Forms, ale musisz dodać odwołanie do zestawu System.Windows.Forms!

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.