Ve své nedávné práci chci vytvořit malý nástroj pro připomínky klientů; Přirozeně musí program winform číst konfigurační soubor stejného adresáře jako aplikace (nikoli exe.config soubor);
Abych si přečetl adresář, kde se aktuální aplikace nachází, hned mě napadlo System.Environment.CurrentDirectory, abych získal aktuální pracovní adresář. Program běží bezchybně;
Když jsem ráno přišel do práce, objevilo se to: "Přečíst chybějící konfigurační soubor". Aplikace přidává automatické spuštění při startu. Tato zpráva se zobrazí pro čtení selhání konfiguračního souboru a okamžitou kontrolu, zda konfigurační soubor v adresáři aplikace nebyl smazán sám od sebe. Po kontrole jsem zjistil, že soubor tam stále je, tak jsem program ukončil a znovu ho spustil
Stále v pořádku, žádný vyskakovací profil pro čtení nechybí. Pak zjistit, jestli cesta k bootovacímu záznamu v registru není v mém adresáři? Když se podívám na soubor s cestou, je to v pořádku. Trochu zmatený? Odhlásím se z počítače a zkusím restart, ale stále se objeví konfigurační soubor. Důvod, proč nemůžete najít cestu, bude přímo vysvětlen
MessageBox, program sběží a zjistí, že cesta je skutečně tato cesta.
Přidejte kód MessageBox a pokračujte v bootování testu. Když jsem spustil počítač, zjistil jsem, že aktuální adresář byl C:\Windows\System32, a hned jsem byl zmatený. Říkal jsem si, jestli by to mohlo být tím, že program Lao Tzua běží až na system32? Kontroluji registr a sysetm32 nemá mou aplikaci. Nakonec jsem si myslel, že by měl být problém s kódem, aby se cesta dostala.
Po opakovaném testování bylo zjištěno, že System.Environment.CurrentDirectory skutečně získává aktuální adresář, ale pokud program A volá program B a program B používá System.Environment.CurrentDirectory k získání adresáře. Pak adresář získaný v programu B již není adresářem, kde se aplikace B nachází; Stává se adresářem, kde se nachází A. Není těžké zjistit, že adresář, který se objeví při startu, je C:\Windows\System32, protože program pro samospuštění při startu je také volán procesem ve Windows.
Proto, pokud chce program winform získat adresář, kde se aktuální aplikace nachází, je nejlepší nepoužívat System.Environment.CurrentDirectory. Místo toho je to: Application.StartupPath Takto nezáleží na tom, kdo to volá.
Testovací kód:
Převedeno z:Přihlášení k hypertextovému odkazu je viditelné.
|