V svojem nedavnem delu želim izdelati majhno orodje za opomnike strank; Seveda mora winform program prebrati konfiguracijsko datoteko iste mape kot aplikacija (ne exe.config datoteke);
Da bi prebral imenik, kjer se nahaja trenutna aplikacija, sem takoj pomislil na System.Environment.CurrentDirectory, da dobim trenutno delovno imenik. Program deluje brezhibno;
Ko sem naslednje jutro prišel v službo, se je pojavilo: "Preberi konfiguracijsko datoteko manjka". Aplikacija doda samodejni zagon zagona. To sporočilo se pojavi za branje napake konfiguracijske datoteke in takoj preveri, ali je konfiguracijska datoteka v aplikacijski mapi sama izbrisana. Po preverjanju sem ugotovil, da je datoteka še vedno tam, zato sem program zaprl in ga ponovno zagnal
Še vedno je v redu, noben pokalen profil za branje ne manjka. Nato preverim, ali pot do zagonskega vnosa v registru ni v moji mapi? Če pogledam datoteko poti, je v redu. Malo zmeden? Odjavi se iz računalnika in poskusi ponovno zagnati, še vedno se pojavi, konfiguracijska datoteka manjka. Razlog, da ne najdeš poti, bo neposredno sprejet
MessageBox, program se zažene in ugotovi, da je pot res ta pot.
Dodaj kodo MessageBox in nadaljuj z zagonom testa. Ko sem zagnal računalnik, sem ugotovil, da se je trenutno prikazala mapa C:\Windows\System32, in takoj sem bil zmeden. Pomislil sem, ali je mogoče, da je program Lao Tzuja segal do system32? Preverjanje registra in sysetm32 ne vsebuje moje aplikacije. Nazadnje sem pomislil, da bi morala biti težava s kodo za pridobitev poti.
Po večkratnem testiranju so ugotovili, da System.Environment.CurrentDirectory res pridobi trenutno imenik, vendar če program A kliče program B, program B pa uporabi System.Environment.CurrentDirectory za pridobitev imenika. Takrat imenik, pridobljen v programu B, ni več imenik, kjer se nahaja aplikacija B; Postane imenik, kjer se nahaja A. Ni težko najti, da se ob zagonu pojavi mapa C:\Windows\System32, saj program za samozagon zagona pokliče tudi proces v Windows.
Zato, če želi winform program pridobiti imenik, kjer se nahaja trenutna aplikacija, je najbolje, da ne uporablja System.Environment.CurrentDirectory. Namesto tega je: Application.StartupPath Tako ni pomembno, kdo ga pokliče.
Testna koda:
Preneseno iz:Prijava do hiperpovezave je vidna.
|