Viimeisimmissä töissäni haluan tehdä pienen työkalun asiakkaiden muistutuksiin; Luonnollisesti winform-ohjelman täytyy lukea saman hakemiston konfiguraatiotiedosto kuin sovellus (ei exe.config-tiedostoa);
Lukeakseni hakemiston, jossa nykyinen sovellus sijaitsee, ajattelin heti System.Environment.CurrentDirectorya saadakseni nykyisen toimivan hakemiston. Ohjelma vaikuttaa toimivan moitteettomasti;
Kun tulin töihin seuraavana aamuna, näyttö ilmestyi: "Read configuration file missing". Sovellus lisää käynnistyksen automaattisen käynnistyksen. Tämä viesti ilmestyy lukemaan konfiguraatiotiedoston virheen ja tarkistamaan heti, onko sovellushakemiston konfiguraatiotiedosto poistettu itsestään. Tarkistettuani huomasin, että tiedosto oli yhä siellä, ja poistin ohjelman ja käynnistin sen uudelleen
Silti kaikki hyvin, yhtään ponnahdusikkunan lukuprofiilia ei puutu. Sitten tarkistaa, onko käynnistysmerkinnän polku rekisterissä hakemistossani? Kun katson polkutiedostoa, se on ihan ok. Vähän hämmentynyt? Kirjaudun ulos koneelta ja yritän käynnistää uudelleen, mutta silti ilmestyy konfiguraatiotiedosto puuttuu. Syy siihen, ettei reittiä löydetty, otetaan suoraan huomioon
MessageBoxissa ohjelma käynnistyy ja huomaa, että polku on todellakin tämä polku.
Lisää MessageBox-koodi ja jatka testin käynnistämistä. Kun käynnistin, huomasin nykyisen hakemiston olevan C:\Windows\System32, ja olin heti hämmentynyt. Ajattelin itsekseni, voisiko Lao Tzun ohjelma laskeutua system32:een? Tarkistan rekisterin, eikä sysetm32:lla ole omaa sovellustani. Lopuksi ajattelin, että polun saamiseksi koodissa pitäisi olla ongelma.
Toistuvien testien jälkeen havaittiin, että System.Environment.CurrentDirectory on todellakin tarkoitettu hakemistoon, mutta jos ohjelma A kutsuu ohjelmaa B ja ohjelma B käyttää System.Environment.CurrentDirectorya hakemiston saamiseksi. Tällöin B-ohjelmassa saatu hakemisto ei enää ole se hakemisto, jossa B-sovellus sijaitsee; Siitä tulee hakemisto, jossa A sijaitsee. Ei ole vaikeaa huomata, että hakemisto, joka avautuu käynnistyksen yhteydessä, on C:\Windows\System32, koska käynnistysohjelma kutsutaan myös Windowsin prosessilla.
Siksi, jos winform-ohjelma haluaa saada hakemiston, jossa nykyinen sovellus sijaitsee, on parasta olla käyttämättä System.Environment.CurrentDirectorya. Sen sijaan se on: Application.StartupPath Näin ei ole väliä, kuka sen kutsuu.
Testikoodi:
Siirretty:Hyperlinkin kirjautuminen on näkyvissä.
|