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);//檔案名稱(不包括路徑)