Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 31124|Atsakyti: 2

[Konsolės programa] Būkite atsargūs System.Environment.CurrentDirectory, kad gautumėte dabartinį katalogą

[Kopijuoti nuorodą]
Paskelbta 2020-11-10 15:04:17 | | | |
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.




Ankstesnis:K8S tinklo flanelės ir kaliko palyginimas
Kitą:C# zondavimo būdu įdeda nuorodų bibliotekos DLL į poaplankius
 Savininkas| Paskelbta 2020-11-10 15:08:26 |
C# yra metodų rinkinys, skirtas gauti dabartinį programos veikimo kelią

Gaukite visą dabartinio proceso kelią, įskaitant failo vardą (proceso pavadinimą).
eilutė str = tai. GetType(). Surinkimas.Vieta;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Visas kelias į pagrindinį modulį, kuris gauna naują proceso komponentą ir susieja jį su šiuo metu aktyviu procesu, įskaitant failo pavadinimą (proceso pavadinimą).
string str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

Gauna dabartinės gijos dabartinio programos domeno pagrindinį katalogą, kurį naudoja rinkinio konfliktų sprendėjas rinkiniui ištirti.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Gaukite ir nustatykite katalogo, kuriame yra programa, pavadinimą. (Rekomenduojama)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Gaukite vykdomojo failo, kuris paleido programą, kelią, išskyrus vykdomojo failo pavadinimą.
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Gaukite dabartinį programos darbinį katalogą (nepatikimas).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Paskelbta 2021-09-22 20:38:52 |
Išmokite mokytis...
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com