See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 31124|Vastuse: 2

[Konsooliprogramm] Ole ettevaatlik System.Environment.CurrentDirectory suhtes, et saada praegune kataloog

[Kopeeri link]
Postitatud 10.11.2020 15:04:17 | | | |
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.




Eelmine:K8S võrgu flanelli ja kaliko võrdlus
Järgmine:C# paigutab viiteteegi DLL-id alamkaustadesse sondimise kaudu
 Üürileandja| Postitatud 10.11.2020 15:08:26 |
C# on meetodite kogum, et saada praegune programm käivituse rada

Saa kogu tee praeguse protsessini, sealhulgas failinimi (protsessi nimi).
string str = see. GetType(). Assamblee. Asukoht;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Täielik tee põhimoodulisse, mis saab uue protsessikomponendi ja seob selle hetkel aktiivse protsessiga, sealhulgas failinimi (protsessinimi).
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文件所在的目录)

Saab praeguse rakendusdomeeni baaskataloogi praegusest lõimest, mida assembly konfliktide lahendaja kasutab assamblee uurimiseks.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Hangi ja määra rakenduse sisaldava kataloogi nimi. (Soovitatav)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Hangi tee käivitatava failini, mis käivitas rakenduse, ilma käivitatava faili nimeta.
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文件名)

Hangi rakenduse praegune töökataloog (ebausaldusväärne).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Postitatud 22.09.2021 20:38:52 |
Õpi õppima...
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com