警惕使用System.Environment.CurrentDirectory遇到的坑
今天調(diào)試程序的時(shí)候遇到一個(gè)大坑,程序A(exe)通過(guò)Process Start啟動(dòng)程序B(exe)進(jìn)程,總是報(bào)錯(cuò)。
上圖是程序結(jié)構(gòu),為了讓所有的程序B實(shí)例共享配置,所以把a(bǔ)pp.ini放在了bin的上級(jí)目錄。
啟動(dòng)進(jìn)程代碼:
最后定位到配置文件路徑讀取問(wèn)題。這是System.Environment.CurrentDirectory遇到大坑。
程序B中有一下代碼是用于獲取app.ini中的配置:
問(wèn)題癥狀:
通過(guò)程序A啟動(dòng)B,報(bào)錯(cuò)。但是通過(guò)單獨(dú)啟動(dòng)程序B正常。
后來(lái)發(fā)現(xiàn)System.Environment.CurrentDirectory確實(shí)是獲取當(dāng)前目錄沒(méi)錯(cuò),但是如果A程序調(diào)用B程序,當(dāng)B程序里使用了System.Environment.CurrentDirectory獲取目錄。那么這個(gè)B程序里獲取的這個(gè)目錄就不再是B的應(yīng)用程序所在目錄了;而變成了A所在的目錄了。
解決方案:
1、使用Application.StartupPath獲取目錄,需要引用:using System.Windows.Forms,因此這個(gè)方法只能用于winform程序。
2、使用AppDomain.CurrentDomain.BaseDirectory,通用方案,可以用于類庫(kù)。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
后來(lái)發(fā)現(xiàn)很多網(wǎng)友和我遇到過(guò)一樣的問(wèn)題。
下面引用一下網(wǎng)友寫的文章:
https://blog.csdn.net/albert528108/article/details/102958457
我以前寫的代碼中獲取當(dāng)前路徑基本上都是使用的System.Environment.CurrentDirectory。
但是最近在用另外一個(gè)程序A去調(diào)用以前的程序B的時(shí)候就出現(xiàn)問(wèn)題了,程序A的作用只是單純調(diào)取程序B的exe文件,在B執(zhí)行過(guò)程中總是真到當(dāng)前路徑這塊就出現(xiàn)了問(wèn)題,實(shí)際找到的路徑是程序A的路徑。
??? 程序A目錄:D:\a
??? 程序B目錄:D:\b
??? 當(dāng)程序A調(diào)用程序B時(shí),程序B中的Environment.CurrentDirectory結(jié)果是D:\a,而不是D:\b!!
經(jīng)反復(fù)測(cè)試發(fā)現(xiàn)System.Environment.CurrentDirectory確實(shí)是獲取當(dāng)前目錄沒(méi)錯(cuò),但是如果A程序調(diào)用B程序 B程序里使用了System.Environment.CurrentDirectory獲取目錄。那么這個(gè)B程序里獲取的這個(gè)目錄就不再是B的應(yīng)用程序所在目錄了;而變成了A所在的目錄了。這也就不難發(fā)現(xiàn)我在開機(jī)時(shí)彈出的目錄是C:\Windows\System32 因?yàn)殚_機(jī)自啟動(dòng)程序也是由windows的某個(gè)進(jìn)程調(diào)用的。
當(dāng)遇到這樣的情況時(shí),我自己的解決方案是:
把所有System.Environment.CurrentDirectory改成System.AppDomain.CurrentDomain.BaseDirectory。
網(wǎng)上也有很多人說(shuō)針對(duì)winform可以改成Application.StartupPath。
C# WinForm中AppDomain.CurrentDomain.BaseDirectory與Application.StartupPath的區(qū)別示例如下:
??? 1. AppDomain.CurrentDomain.BaseDirectory 返回結(jié)果為: D:\xxx\
??? Application.StartupPath 返回結(jié)果為: D:\xxx
??? 2. Application.StartupPath 只能用于WinForm窗體中,而AppDomain.CurrentDomain.BaseDirectory既可以用于WinForm窗體中,也可以用于類庫(kù)DLL文件中。
總結(jié)
以上是生活随笔為你收集整理的警惕使用System.Environment.CurrentDirectory遇到的坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 门槛石忌讳有哪些
- 下一篇: 代办房产证交了契税有通知吗