Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 31124|Antwoord: 2

[Consoleprogramma] Wees voorzichtig met System.Environment.CurrentDirectory om de huidige map te krijgen

[Link kopiëren]
Geplaatst op 10-11-2020 15:04:17 | | | |
In mijn recente werk wil ik een klein hulpmiddel maken voor klantherinneringen; Natuurlijk moet het winform-programma het configuratiebestand van dezelfde map als de applicatie lezen (niet het exe.config-bestand);

Om de map te lezen waar de huidige applicatie zich bevindt, dacht ik meteen aan System.Environment.CurrentDirectory om de huidige werkmap te krijgen. Het programma lijkt vlekkeloos te verlopen;

Toen ik de volgende ochtend op mijn werk kwam, verscheen het: "Configuratiebestand lezen ontbreekt". De app voegt automatisch opstarten toe. Dit bericht verschijnt om de configuratiebestandfout te lezen, direct te controleren of het configuratiebestand in de applicatiemap vanzelf is verwijderd. Na het controleren zag ik dat het bestand er nog steeds was, en ik heb het programma afgesloten en opnieuw uitgevoerd

Nog steeds prima, geen pop-up profiel ontbreekt. Kijk dan of het pad van de opstartvermelding in het register niet in mijn map staat? Als je naar het padbestand kijkt, is het in orde. Een beetje in de war? Log uit van de computer en probeer opnieuw te starten, maar het verschijnt nog steeds dat het configuratiebestand ontbreekt. De reden dat je de weg niet kunt vinden, wordt direct aangegeven

MessageBox draait het programma en ontdekt dat het pad inderdaad dit pad is.

Voeg de MessageBox-code toe en ga verder met het opstarten van de test. Toen ik opstartte, zag ik dat de huidige map die verscheen C:\Windows\System32 was, en ik was meteen in de war. Ik dacht bij mezelf, zou het kunnen dat het programma van Lao Tzu tot aan system32 liep? Ik controleer het register en sysetm32 heeft mijn app niet. Tot slot dacht ik dat er een probleem moest zijn met de code om het pad te krijgen.

Na herhaald testen bleek dat System.Environment.CurrentDirectory inderdaad bedoeld is om de huidige map te krijgen, maar als programma A programma B aanroept en programma B System.Environment.CurrentDirectory gebruikt om de map te verkrijgen. Dan is de map die in het B-programma wordt verkregen niet langer de map waarin de B-applicatie zich bevindt; Het wordt de directory waar A zich bevindt. Het is niet moeilijk om te ontdekken dat de map die verschijnt als ik opstart C:\Windows\System32 is, omdat het zelfopstartprogramma ook wordt aangeroepen door een proces in Windows.

Daarom is het het beste om System.Environment.CurrentDirectory niet te gebruiken als het winform-programma de map wil verkrijgen waar de huidige applicatie zich bevindt. In plaats daarvan is het: Application.StartupPath Op deze manier maakt het niet uit wie het oproept.

Testcode:




Overgedragen van:De hyperlink-login is zichtbaar.




Vorig:K8S-netwerkflanel en calico vergelijking
Volgend:C# plaatst referentiebibliotheek-DLL's in submappen via probing
 Huisbaas| Geplaatst op 10-11-2020 15:08:26 |
C# is een verzameling methoden om het huidige programmapad te krijgen dat het looppad loopt

Haal het volledige pad naar het huidige proces, inclusief de bestandsnaam (procesnaam).
string str = dit. GetType(). Assemblage. Locatie;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Het volledige pad naar de hoofdmodule dat de nieuwe Procescomponent ophaalt en koppelt aan het momenteel actieve proces, inclusief de bestandsnaam (procesnaam).
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文件所在的目录)

Krijgt de basismap van het huidige applicatiedomein van de huidige Thread, die door de assembly conflict solver wordt gebruikt om de assembly te onderzoeken.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Haal de naam op en stel de naam in van de map die de applicatie bevat. (Aanbevolen)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Haal het pad naar het uitvoerbare bestand dat de applicatie heeft gestart, exclusief de naam van het uitvoerbare bestand.
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文件名)

Haal de huidige werkmap van de applicatie op (onbetrouwbaar).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Geplaatst op 22-09-2021 20:38:52 |
Leer leren...
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com