轉:關於C#程式路徑的問題

來源:互聯網
上載者:User

C#獲得程式路徑的確有點惱人,我都在被弄糊塗兩次了,把別人的文章摘錄如下:

 

關於C#程式路徑的問題
最近在做的一個小程式中 需要讀取設定檔。我把設定檔放個程式的根目錄,在代碼中使用相對目錄來訪問的。開始一切都好好的,沒什麼問題。

昨天,在我給程式加了個資料匯出功能後,就讀不到設定檔了。很是鬱悶。因為在系統載入的生活設定檔都能正常地讀出來。但是在啟動並執行時候再讀取就不行了,研究了半天,發現是因為在匯出資料的時候我使用了開啟檔案對話方塊。於是相對路徑改變了。

總結下:讀取設定檔一定要用代碼取出該檔案的絕對路徑。可以使用下面的兩個靜態方法:
Application.ExecutablePath 包括檔案名稱
Application.StartupPath 不包括檔案名稱。

不是在Windows應用中呢,或者是在Library中呢,就算是Application對象的屬性依然能獲得,也需要在工程中添加System.Windows.Forms這個Assembly的引用,非常不方便。這個時候,可以通過Assembly的靜態方法,GetCallingAssembly或者GetExecutingAssembly取得當前執行的Assembly,然後通過Assembly類的Location擷取assembly的位置。

  但是使用Assembly的時候,可能會遇到許可權方面的問題,同時Assembly.GetCallingAssembly或者Assembly.GetExecutingAssembly有可能得到的不是.exe檔案的位置。在GAC中的添加了強名的Assembly,運行時是可以不必與.exe在同一目錄的。

  .NET的進程啟動時,會建立AppDomain,所有的Assembly都被Load到某一個AppDomain中,而AppDomain中提供了SetupInformation屬性,可以擷取AppDomain啟動時的一些資訊,因此,可以通過調用AppDomain.CurrentDomain.SetupInformation.ApplicationBase擷取當前應用程式所在的路徑。

  在通過以上方法取到所需的目錄後,可以調用System.IO.Path的方法擷取檔案名稱,目錄名,絕對路徑等。停止對路徑字串的分析,而改用System.IO.Path類吧。

  開發.NET下應用程式時,瞭解Process/Application->AppDomain->Assembly的關係,對於實現正確的邏輯,是非常有協助的。

關於c#中程式路徑處理的問題

擷取當前程式檔案的路徑也算是一個比較常見的需求,比如我有一個檔案conn.xml位於.exe的同一目錄,在運行時需要從中讀取一些設定資訊。
  
  進程對象在.NET中表現為System.Diagnostics.Process類,通過調用Process.GetCurrentProcess().MainModule.FileName可獲得當前執行的exe的檔案名稱。但是這個方法得到的僅僅是檔案名稱,如果程式運行期間沒有切換工作目錄,那麼可以調用System.IO.Path的方法擷取絕對路徑。但是目前的目錄同樣可以通過Environment.CurrentDirectory獲得,而且很多軟體在使用Open Dialog開啟檔案的時候,都會切換工作目錄,而使得這一機制失效。

  如果是在Windows Forms應用程式中,當前應用也表現為System.Windows.Forms.Application對象,通過其靜態屬性Application.ExecutablePath和Application.StartupPath,可以取得可執行檔的路徑和啟動路徑。

  但如果不是在Windows應用中呢,或者是在Library中呢,就算是Application對象的屬性依然能獲得,也需要在工程中添加System.Windows.Forms這個Assembly的引用,非常不方便。這個時候,可以通過Assembly的靜態方法,GetCallingAssembly或者GetExecutingAssembly取得當前執行的Assembly,然後通過Assembly類的Location擷取assembly的位置。

  但是使用Assembly的時候,可能會遇到許可權方面的問題,同時Assembly.GetCallingAssembly或者Assembly.GetExecutingAssembly有可能得到的不是.exe檔案的位置。在GAC中的添加了強名的Assembly,運行時是可以不必與.exe在同一目錄的。

  .NET的進程啟動時,會建立AppDomain,所有的Assembly都被Load到某一個AppDomain中,而AppDomain中提供了SetupInformation屬性,可以擷取AppDomain啟動時的一些資訊,因此,可以通過調用AppDomain.CurrentDomain.SetupInformation.ApplicationBase擷取當前應用程式所在的路徑。

  在通過以上方法取到所需的目錄後,可以調用System.IO.Path的方法擷取檔案名稱,目錄名,絕對路徑等。停止對路徑字串的分析,而改用System.IO.Path類吧。

  開發.NET下應用程式時,瞭解Process/Application->AppDomain->Assembly的關係,對於實現正確的邏輯,是非常有協助的。

總結C#中得到程式當前工作目錄和執行目錄的一些方法

1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
  擷取模組的完整路徑。
2.   System.Environment.CurrentDirectory
  擷取和設定目前的目錄(該進程從中啟動的目錄)的完全限定目錄。
3.   System.IO.Directory.GetCurrentDirectory()
  擷取應用程式的當前工作目錄。這個不一定是程式從中啟動的目錄啊,有可能程式放在C:\www裡,這個函數有可能返回C:\Documents and Settings\ZYB\,或者C:\Program Files\Adobe\,有時不一定返回什麼東東,我也搞不懂了。
4. System.AppDomain.CurrentDomain.BaseDirectory
  擷取程式的基目錄。
5. System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
  擷取和設定包括該應用程式的目錄的名稱。
6. System.Windows.Forms.Application.StartupPath
  擷取啟動了應用程式的可執行檔的路徑。效果和2、5一樣。只是5返回的字串後面多了一個"\"而已
7. System.Windows.Forms.Application.ExecutablePath
  擷取啟動了應用程式的可執行檔的路徑及檔案名稱,效果和1一樣。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/Houluoxuan_168/archive/2010/04/14/5486019.aspx

 

另,如何從地址字串獲得檔案名稱,一併記錄如下

string   sPath   =   OpenFileDialog.FileName;  
  int   allnum   =   sPath.Length;  
  int   pos   =   sPath.LastIndexOf(@"\");  
  appPath   =   sPath.Substring(0,   pos);//檔案的路徑(不包括檔案名稱)  
  appPath   =   sPath.Substring(pos,allnum);//檔案名稱(不包括路徑)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.