Savo naujausiame darbe noriu sukurti nedidelį įrankį klientų priminimams; Natūralu, kad winform programa turi perskaityti to paties katalogo konfigūracijos failą kaip ir programa (ne exe.config failą);
Norėdami perskaityti katalogą, kuriame yra dabartinė programa, iškart pagalvojau apie System.Environment.CurrentDirectory, kad gaučiau dabartinį darbinį katalogą. Atrodo, kad programa veikia nepriekaištingai;
Kai aš atėjau į darbą kitą rytą, jis pasirodė: "Skaityti konfigūracijos failą trūksta". Programa prideda įkrovos automatinį paleidimą. Šis pranešimas pasirodo norėdami perskaityti konfigūracijos failo gedimą, nedelsdami patikrinkite, ar konfigūracijos failas programos kataloge buvo ištrintas pats. Patikrinęs radau, kad failas vis dar yra, ir išėjau iš programos ir paleidau jį dar kartą
Vis dar gerai, trūksta iššokančio skaitymo profilio. Tada pažiūrėkite, ar registro įkrovos įrašo kelias nėra mano kataloge? Pažvelgus į kelio failą, viskas gerai. Šiek tiek sutrikęs? Atsijunkite nuo kompiuterio ir pabandykite jį paleisti iš naujo, vis tiek pasirodo, trūksta konfigūracijos failo. Priežastis, dėl kurios negalėsime rasti kelio, bus imtasi tiesiogiai
MessageBox, programa veikia ir randa, kad kelias iš tiesų yra šis kelias.
Pridėkite "MessageBox" kodą ir toliau paleiskite testą. Kai paleidau, pastebėjau, kad dabartinis katalogas, kuris pasirodė, buvo C:\Windows\System32, ir iš karto buvau suglumęs. Aš pagalvojau, ar gali būti, kad Lao Tzu programa nubėgo iki system32? Tikrinant registrą ir sysetm32 neturi mano programos. Galiausiai, aš maniau, kad turėtų būti problema su kodu gauti kelią.
Po pakartotinių bandymų buvo nustatyta, kad System.Environment.CurrentDirectory iš tiesų turi gauti dabartinį katalogą, bet jei programa A iškviečia programą B, o programa B naudoja System.Environment.CurrentDirectory, kad gautų katalogą. Tada B programoje gautas katalogas nebėra katalogas, kuriame yra B programa; Tai tampa katalogu, kuriame yra A. Nesunku rasti, kad katalogas, kuris pasirodo, kai paleidžiu, yra C:\Windows\System32, nes įkrovos savaiminio paleidimo programa taip pat vadinama "Windows" procesu.
Todėl, jei winform programa nori gauti katalogą, kuriame yra dabartinė programa, geriausia nenaudoti System.Environment.CurrentDirectory. Vietoj to, tai yra: Application.StartupPath Tokiu būdu nesvarbu, kas jį vadina.
Bandymo kodas:
Perkelta iš:Hipersaito prisijungimas matomas.
|