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.
|