Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 31124|Svar: 2

[Konsolprogram] Var försiktig med System.Environment.CurrentDirectory för att få tag på den aktuella katalogen

[Kopiera länk]
Publicerad på 2020-11-10 15:04:17 | | | |
I mitt senaste arbete vill jag skapa ett litet verktyg för klientpåminnelser; Naturligtvis måste winform-programmet läsa konfigurationsfilen i samma katalog som applikationen (inte exe.config-filen);

För att läsa katalogen där den aktuella applikationen är placerad tänkte jag genast på System.Environment.CurrentDirectory för att få den aktuella arbetskatalogen. Programmet verkar fungera felfritt;

När jag kom till jobbet nästa morgon dök det upp: "Läs konfigurationsfil saknas". Appen lägger till automatisk start för uppstart. Detta meddelande dyker upp för att läsa konfigurationsfilens fel, kontrollera omedelbart om konfigurationsfilen i applikationskatalogen har raderats av sig själv. Efter att ha kollat upptäckte jag att filen fortfarande fanns kvar, och jag avslutade programmet och körde det igen

Fortfarande bra, ingen popup-profil saknas. Se sedan om sökvägen för startposten i registret inte finns i min katalog? Om man tittar på sökfilen är det okej. Lite förvirrad? Logga ut från datorn och försök starta om, men det dyker fortfarande upp, konfigurationsfilen saknas. Anledningen till att vi inte kan hitta vägen kommer att tas direkt

MessageBox, körs programmet och hittar att vägen faktiskt är denna väg.

Lägg till MessageBox-koden och fortsätt starta testet. När jag startade upp upptäckte jag att den aktuella katalogen som dök upp var C:\Windows\System32, och jag blev genast förbryllad. Jag tänkte för mig själv, kan det vara så att Lao Tzus program gick ner till system32? Att kolla registret och sysetm32 har inte min app. Till slut tänkte jag att det borde vara ett problem med koden för att få fram vägen.

Efter upprepade tester upptäcktes att System.Environment.CurrentDirectory faktiskt är till för att hämta den aktuella katalogen, men om program A anropar program B och program B använder System.Environment.CurrentDirectory för att hämta katalogen. Då är katalogen som erhålls i B-programmet inte längre den katalog där B-applikationen är placerad; Den blir katalogen där A finns. Det är inte svårt att hitta att katalogen som dyker upp när jag startar är C:\Windows\System32 eftersom startprogrammet också anropas av en process i Windows.

Därför, om winform-programmet vill hämta katalogen där den aktuella applikationen är placerad, är det bäst att inte använda System.Environment.CurrentDirectory. Istället är det: Application.StartupPath På det här sättet spelar det ingen roll vem som ropar det.

Testkod:




Överförd från:Inloggningen med hyperlänken är synlig.




Föregående:K8S-nätverksflannel och kalikojämförelse
Nästa:C# placerar referensbiblioteks-DLL:er i undermappar via probing
 Hyresvärd| Publicerad på 2020-11-10 15:08:26 |
C# är en samling metoder för att få den aktuella programvägen att köra

Få hela sökvägen till den aktuella processen, inklusive filnamnet (processnamn).
strängstr = detta. GetType(). Montering. Plats;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Den fullständiga vägen till huvudmodulen som hämtar den nya Process-komponenten och kopplar den till den pågående processen, inklusive filnamnet (processnamn).
sträng str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

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

Hämtar baskatalogen för den aktuella applikationsdomänen för den aktuella Threaden, som används av assemblerkonfliktlösaren för att undersöka assembleren.
sträng str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Hämta och sätt namnet på katalogen som innehåller applikationen. (Rekommenderas)
sträng str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Få sökvägen till den körbara filen som startade applikationen, exklusive namnet på den körbara filen.
sträng str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

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

Hämta applikationens aktuella arbetskatalog (opålitlig).
sträng str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Publicerad på 2021-09-22 20:38:52 |
Lär dig att lära dig...
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com