日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

警惕使用System.Environment.CurrentDirectory遇到的坑

發布時間:2024/9/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 警惕使用System.Environment.CurrentDirectory遇到的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天調試程序的時候遇到一個大坑,程序A(exe)通過Process Start啟動程序B(exe)進程,總是報錯。

上圖是程序結構,為了讓所有的程序B實例共享配置,所以把app.ini放在了bin的上級目錄。

啟動進程代碼:

  • System.Diagnostics.Process p = new System.Diagnostics.Process();
  • p.StartInfo = new ProcessStartInfo(fileName);
  • p.Start();
  • 最后定位到配置文件路徑讀取問題。這是System.Environment.CurrentDirectory遇到大坑。

    程序B中有一下代碼是用于獲取app.ini中的配置:

  • DirectoryInfo topDir = Directory.GetParent(System.Environment.CurrentDirectory);
  • string iniFileName = Path.Combine(topDir.FullName, "app.ini");
  • 問題癥狀:

    通過程序A啟動B,報錯。但是通過單獨啟動程序B正常。

    后來發現System.Environment.CurrentDirectory確實是獲取當前目錄沒錯,但是如果A程序調用B程序,當B程序里使用了System.Environment.CurrentDirectory獲取目錄。那么這個B程序里獲取的這個目錄就不再是B的應用程序所在目錄了;而變成了A所在的目錄了。

    解決方案:

    1、使用Application.StartupPath獲取目錄,需要引用:using System.Windows.Forms,因此這個方法只能用于winform程序。

    2、使用AppDomain.CurrentDomain.BaseDirectory,通用方案,可以用于類庫。

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    后來發現很多網友和我遇到過一樣的問題。

    下面引用一下網友寫的文章:

    https://blog.csdn.net/albert528108/article/details/102958457

  • // 獲取程序的基目錄。
  • System.AppDomain.CurrentDomain.BaseDirectory
  • // 獲取模塊的完整路徑。
  • System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
  • // 獲取和設置當前目錄(該進程從中啟動的目錄)的完全限定目錄。
  • System.Environment.CurrentDirectory
  • // 獲取應用程序的當前工作目錄。
  • System.IO.Directory.GetCurrentDirectory()
  • // 獲取和設置包括該應用程序的目錄的名稱。
  • System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
  • // 獲取啟動了應用程序的可執行文件的路徑。
  • System.Windows.Forms.Application.StartupPath
  • // 獲取啟動了應用程序的可執行文件的路徑及文件名
  • System.Windows.Forms.Application.ExecutablePath
  • 我以前寫的代碼中獲取當前路徑基本上都是使用的System.Environment.CurrentDirectory。
    但是最近在用另外一個程序A去調用以前的程序B的時候就出現問題了,程序A的作用只是單純調取程序B的exe文件,在B執行過程中總是真到當前路徑這塊就出現了問題,實際找到的路徑是程序A的路徑。
    ??? 程序A目錄:D:\a
    ??? 程序B目錄:D:\b
    ??? 當程序A調用程序B時,程序B中的Environment.CurrentDirectory結果是D:\a,而不是D:\b!!
    經反復測試發現System.Environment.CurrentDirectory確實是獲取當前目錄沒錯,但是如果A程序調用B程序 B程序里使用了System.Environment.CurrentDirectory獲取目錄。那么這個B程序里獲取的這個目錄就不再是B的應用程序所在目錄了;而變成了A所在的目錄了。這也就不難發現我在開機時彈出的目錄是C:\Windows\System32 因為開機自啟動程序也是由windows的某個進程調用的。
    當遇到這樣的情況時,我自己的解決方案是:
    把所有System.Environment.CurrentDirectory改成System.AppDomain.CurrentDomain.BaseDirectory。
    網上也有很多人說針對winform可以改成Application.StartupPath。
    C# WinForm中AppDomain.CurrentDomain.BaseDirectory與Application.StartupPath的區別示例如下:
    ??? 1. AppDomain.CurrentDomain.BaseDirectory 返回結果為: D:\xxx\
    ??? Application.StartupPath 返回結果為: D:\xxx
    ??? 2. Application.StartupPath 只能用于WinForm窗體中,而AppDomain.CurrentDomain.BaseDirectory既可以用于WinForm窗體中,也可以用于類庫DLL文件中。

    總結

    以上是生活随笔為你收集整理的警惕使用System.Environment.CurrentDirectory遇到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。