Oma hiljutises töös tahan teha väikese tööriista klientide meeldetuletuste jaoks; Loomulikult peab winform programm lugema sama kataloogi konfiguratsioonifaili, kus rakendus (mitte exe.config faili);
Et lugeda kataloogi, kus praegune rakendus asub, mõtlesin kohe System.Environment.CurrentDirectory peale, et saada praegune töökataloog. Programm tundub töötavat laitmatult;
Kui järgmisel hommikul tööle tulin, ilmus see üles: "Loe konfiguratsioonifaili puudumine". Rakendus lisab käivitamise automaatse käivituse. See teade ilmub, et lugeda konfiguratsioonifaili riket ja kohe kontrollida, kas rakenduse kataloogis olev konfiguratsioonifail on ise kustutatud. Pärast kontrollimist avastasin, et fail oli endiselt alles, väljusin programmist ja käivitasin selle uuesti
Endiselt korras, ühtegi hüpikakna lugemisprofiili ei puudu. Siis vaatan, kas käivituskirje tee registris ei ole minu kataloogis? Vaadates teefaili, on kõik korras. Veidi segaduses? Logisin arvutist välja ja proovisin taaskäivitada, aga ikka ilmub – konfiguratsioonifail on kadunud. Põhjus, miks teed ei leia, võetakse otse
MessageBox, programm käivitub ja leiab, et tee on tõepoolest see tee.
Lisa MessageBoxi kood ja jätka testi käivitamist. Kui käivitasin, avastasin, et praegune kataloog ilmus C:\Windows\System32 ja olin kohe segaduses. Mõtlesin endamisi, kas võib olla, et Lao Tzu programm jooksis system32-le? Kontrollin registrit ja sysetm32-l pole minu rakendust. Lõpuks arvasin, et koodiga peaks olema probleem, et tee saada.
Korduvate testide järel selgus, et System.Environment.CurrentDirectory on tõepoolest selleks, et saada praegune kataloog, kuid kui programm A kutsub programmi B ja programm B kasutab kataloogi saamiseks System.Environment.CurrentDirectory. Siis ei ole B programmis saadud kataloog enam see kataloog, kus B rakendus asub; Sellest saab kataloog, kus A asub. Pole raske leida, et kausta, mis ilmub käivitamisel, on C:\Windows\System32, sest käivitamise isekäivitumise programm kutsutakse samuti Windowsi protsessi kaudu.
Seetõttu, kui winform programm soovib saada kataloogi, kus praegune rakendus asub, on parem mitte kasutada System.Environment.CurrentDirectory. Selle asemel on: Application.StartupPath Nii ei ole vahet, kes seda kutsub.
Testkood:
Üleviidud:Hüperlingi sisselogimine on nähtav.
|