Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 31124|Válasz: 2

[Konzol program] Légy óvatos a System.Environment.CurrentDirectory oldallal, hogy megkapd a jelenlegi könyvtárat

[Linket másol]
Közzétéve 2020. 11. 10. 15:04:17 | | | |
A legutóbbi munkámban szeretnék készíteni egy kis eszközt az ügyfelek emlékeztetésére; Természetesen a winform programnak el kell olvasnia ugyanannak a könyvtárnak a konfigurációs fájlját, mint az alkalmazás (nem az exe.config fájlt);

Ahhoz, hogy elolvassam azt a könyvtárat, ahol az aktuális alkalmazás található, azonnal eszembe jutott a System.Environment.CurrentDirectory a jelenlegi munkakönyvtár megszerzéséhez. A program hibátlanul fut;

Amikor másnap reggel munkába mentem, megjelent: "Konfigurációs fájl hiányzik". Az alkalmazás hozzáadja a boot automatikus indítást. Ez az üzenet felugrik, hogy elolvassa a konfigurációs fájl hibáját, azonnal ellenőrizzék, hogy az alkalmazás könyvtárban lévő konfigurációs fájl önmagában törölt-e. Ellenőrizve azt tapasztaltam, hogy a fájl még mindig ott van, kiléptem a programból, és újra elindítottam

Még mindig rendben van, nem hiányzik felugró ablak olvasott profil. Aztán megnézhetem, hogy a boot bejegyzés útja nincs a könyvtárban? Az úti fájlt nézve minden rendben van. Kicsit összezavarodtál? Kijelentkeztem a számítógépről és próbáltam újraindítani, de még mindig felugrik, a konfigurációs fájl hiányzik. Az ok a nem talált út közvetlen magyarázatára

MessageBox-ban fut a program, és rájön, hogy az út valóban ez az út.

Add hozzá az üzenetdoboz kódot, és folytasd a teszt indítását. Amikor elindítottam, azt találtam, hogy a jelenlegi, felbukkanó könyvtár C:\Windows\System32 volt, és azonnal összedöbbent. Arra gondoltam, lehet, hogy Lao Tzu programja a system32-re futott? A regisztert nézem, és a sysetm32-ben nincs az alkalmazásom. Végül úgy gondoltam, hogy a kóddal kellene gond lennie, hogy megkapjuk az útvonalat.

Ismételt tesztelés után kiderült, hogy a System.Environment.CurrentDirectory valóban a jelenlegi könyvtár megkapására szolgál, de ha az A program B programot hívja, a B program pedig a System.Environment.CurrentDirectory segítségével kapja meg a könyvtárat. Ekkor a B programban megszerzett könyvtár már nem az a könyvtár, ahol a B alkalmazás található; Ez lesz az a könyvtár, ahol A található. Nem nehéz megtalálni, hogy a boot közben felbukkan cím C:\Windows\System32, mert a boot önindítási programot is egy Windows folyamat hívja.

Ezért, ha a winform program meg akarja szerezni azt a könyvtárat, ahol a jelenlegi alkalmazás található, akkor a legjobb, ha nem használja a System.Environment.CurrentDirectory rendszert. Ehelyett ez az: Application.StartupPath Így nem számít, ki hívja.

Tesztkód:




Áthelyezve:A hiperlink bejelentkezés látható.




Előző:K8S hálózati flanel és calico összehasonlítás
Következő:C# a referenciakönyvtár DLL-eket almappákba helyezi probing révén
 Háziúr| Közzétéve 2020. 11. 10. 15:08:26 |
C# egy metódusgyűjtemény, amely a jelenlegi program futó útvonalát megkapja

Szerezd meg a teljes útvonalat a jelenlegi folyamathoz, beleértve a fájlnevet (folyamatnévet).
string str = ez. GetType(). Gyűlés. Helyszín;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

A teljes út a fő modulhoz, amely megkapja az új Process komponenst, és összekapcsolja azt a jelenleg aktív folyamattal, beleértve a fájlnevet (folyamatnévet).
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文件所在的目录)

Megkapja a jelenlegi Thread alkalmazástartományának alapkönyvtárát, amelyet az assembly konfliktusmegoldó használ az assembly vizsgálatára.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Szerezd meg és állítsd be az alkalmazás tartalmát tartalmazó könyvtár nevét. (Ajánlott)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Szerezd meg az alkalmazást indító futtatható fájl útvonalát, a futtatható fájl nevét nélkül.
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文件名)

Szerezd meg az alkalmazás aktuális munkakönyvtárát (megbízhatatlan).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Közzétéve 2021. 09. 22. 20:38:52 |
Tanulj meg...
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com