Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 31124|Odpowiedź: 2

[Program konsolowy] Uważaj na System.Environment.CurrentDirectory, aby uzyskać aktualny katalog

[Skopiuj link]
Opublikowano 10.11.2020 15:04:17 | | | |
W moich ostatnich pracach chcę stworzyć małe narzędzie do przypominania klientam; Naturalnie, program winform musi odczytać plik konfiguracyjny tego samego katalogu co aplikacja (nie plik exe.config);

Aby przeczytać katalog, w którym znajduje się aktualna aplikacja, od razu pomyślałem o System.Environment.CurrentDirectory, aby uzyskać aktualny katalog roboczy. Program wydaje się działać bez zarzutu;

Kiedy przyszedłem do pracy następnego ranka, pojawiło się pytanie: "Czytaj zaginięty plik konfiguracyjny". Aplikacja dodaje automatyczne uruchamianie startu. Ten komunikat pojawia się, aby odczytać niepowodzenie pliku konfiguracyjnego i natychmiast sprawdzić, czy plik konfiguracyjny w katalogu aplikacji został usunięty samodzielnie. Po sprawdzeniu okazało się, że plik nadal tam jest, więc wyszedłem z programu i uruchomiłem go ponownie

Nadal jest dobrze, nie brakuje żadnego wyskakującego profilu odczytu. Potem sprawdź, czy ścieżka do wpisu bootowego w rejestrze nie znajduje się w moim katalogu? Patrząc na plik ścieżek, jest w porządku. Trochę zdezorientowany? Wyloguję się z komputera i próbuję go zrestartować, nadal się pojawia, plik konfiguracyjny brakuje. Powód, dla którego nie można znaleźć drogi, zostanie przedstawiony bezpośrednio

MessageBox, program uruchamia i odkrywa, że ścieżka faktycznie jest tą ścieżką.

Dodaj kod MessageBox i kontynuuj uruchamianie testu. Po uruchomieniu komputera okazało się, że aktualny katalog to C:\Windows\System32 i od razu byłem zdezorientowany. Pomyślałem sobie, czy to możliwe, że program Lao Tzu działał aż do system32? Sprawdzam rejestr i sysetm32 nie ma mojej aplikacji. Na koniec pomyślałem, że powinien być problem z kodem, żeby uzyskać ścieżkę.

Po wielokrotnych testach okazało się, że System.Environment.CurrentDirectory rzeczywiście służy do pobierania aktualnego katalogu, ale jeśli program A wywołuje program B, a program B używa System.Environment.CurrentDirectory do uzyskania katalogu. Wtedy katalog uzyskany w programie B nie jest już katalogiem, w którym znajduje się aplikacja B; Staje się on katalogiem, w którym znajduje się A. Łatwo jest odkryć, że katalog, który pojawia się po uruchomieniu, to C:\Windows\System32, ponieważ program do samodzielnego uruchamiania startu jest również wywoływany przez proces w Windows.

Dlatego jeśli program winform chce uzyskać katalog, w którym znajduje się aktualna aplikacja, najlepiej nie używać System.Environment.CurrentDirectory. Zamiast tego jest to: Application.StartupPath W ten sposób nie ma znaczenia, kto to wywołuje.

Kod testowy:




Przeniesiono z:Logowanie do linku jest widoczne.




Poprzedni:Porównanie flaneli i kaliko do sieci K8S
Następny:C# umieszcza biblioteki referencyjne DLL w podfolderach poprzez sondowanie
 Ziemianin| Opublikowano 10.11.2020 15:08:26 |
C# to zbiór metod umożliwiających uzyskanie bieżącej ścieżki programu

Uzyskaj pełną ścieżkę do bieżącego procesu, w tym nazwę pliku (nazwa procesu).
String str = to. GetType(). Assembly.Location;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Pełna ścieżka do głównego modułu, który otrzymuje nowy komponent Process i kojarzy go z aktualnie aktywnym procesem, w tym nazwa pliku (nazwa procesu).
string str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

Otrzymuje bazowy katalog aktualnej domeny aplikacji bieżącego wątku, który jest używany przez rozwiązywacz konfliktów asemblerow do badania asemblera.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Pobierz i ustaw nazwę katalogu, który zawiera aplikację. (Polecam)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Pobierz ścieżkę do pliku wykonywalnego, który uruchomił aplikację, z wyłączeniem nazwy pliku wykonywalnego.
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Pobierz aktualny katalog roboczy aplikacji (niewiarygodny).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Opublikowano 22.09.2021 20:38:52 |
Naucz się uczyć...
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com