Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 31124|Vastaus: 2

[Konsoliohjelma] Ole varovainen System.Environment.CurrentDirectoryn kanssa saadaksesi nykyisen hakemiston

[Kopioi linkki]
Julkaistu 10.11.2020 15.04.17 | | | |
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ä.




Edellinen:K8S-verkon flanellin ja kalikon vertailu
Seuraava:C# sijoittaa viitekirjaston DLL-tiedostot alikansioihin probaamalla
 Vuokraisäntä| Julkaistu 10.11.2020 15.08.26 |
C# on kokoelma metodeja, joilla saadaan käynnissä oleva ohjelman polku

Hanki koko polku nykyiseen prosessiin, mukaan lukien tiedoston nimi (prosessin nimi).
string str = tämä. GetType(). Kokoontuminen. Sijainti;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Koko polku päämoduuliin, joka saa uuden prosessikomponentin ja liittää sen tällä hetkellä aktiiviseen prosessiin, mukaan lukien tiedoston nimi (prosessinimi).
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文件所在的目录)

Saa nykyisen sovellusdomainin perushakemiston nykyisestä säikeestä, jota assembly-konfliktinratkaisija käyttää assemblyn tutkimiseen.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Hae ja aseta hakemiston nimi, joka sisältää sovelluksen. (Suositeltava)
merkkijono str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Hanki polku suoritettavaan tiedostoon, joka käynnisti sovelluksen, pois lukien suoritettavan tiedoston nimi.
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文件名)

Hanki sovelluksen nykyinen työhakemisto (epäluotettava).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Julkaistu 22.9.2021 20.38.52 |
Opettele oppimaan...
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com