獲取當前程序文件的路徑也算是一個比較常見的需求比如我有一個文件connxml位於exe的同一目錄在運行時需要從中讀取一些設置信息
string str =ProcessGetCurrentProcess()MainModuleFileName;//可獲得當前執行的exe的文件名
string str=EnvironmentCurrentDirectory;//獲取和設置當前目錄(即該進程從中啟動的目錄)的完全限定路徑
//備注 按照定義如果該進程在本地或網絡驅動器的根目錄中啟動則此屬性的值為驅動器名稱後跟一個尾部反斜槓(如C:\)如果該進程在子目錄中啟 動則此屬性的值為不帶尾部反斜槓的驅動器和子目錄路徑(如C:\mySubDirectory)
string str=DirectoryGetCurrentDirectory();//獲取應用程序的當前工作目錄
string str=AppDomainCurrentDomainBaseDirectory;//獲取基目錄它由程序集沖突解決程序用來探測程序集
string str=ApplicationStartupPath;//獲取啟動了應用程序的可執行文件的路徑不包括可執行文件的名稱
string str=ApplicationExecutablePath;//獲取啟動了應用程序的可執行文件的路徑包括可執行文件的名稱
string str=AppDomainCurrentDomainSetupInformationApplicationBase;//獲取或設置包含該應用程序的目錄的名稱
SystemDiagnosticsProcessGetCurrentProcess()MainModuleFileName
獲取模塊的完整路徑
SystemEnvironmentCurrentDirectory
獲取和設置當前目錄(該進程從中啟動的目錄)的完全限定目錄
SystemIODirectoryGetCurrentDirectory()
獲取應用程序的當前工作目錄這個不一定是程序從中啟動的目錄啊有可能程序放在C:\www裡這個函數有可能返回C:\Documents and Settings\ZYB\或者C:\Program Files\Adobe\有時不一定返回什麼東東我也搞不懂了
SystemAppDomainCurrentDomainBaseDirectory
獲取程序的基目錄
SystemAppDomainCurrentDomainSetupInformationApplicationBase
獲取和設置包括該應用程序的目錄的名稱
SystemWindowsFormsApplicationStartupPath
獲取啟動了應用程序的可執行文件的路徑效果和一樣只是返回的字符串後面多了一個\而已
SystemWindowsFormsApplicationExecutablePath
獲取啟動了應用程序的可執行文件的路徑及文件名效果和一樣
對於Windows程序 和Web 應用程序來說他們運行的路徑是不一樣的所以關鍵是判斷當前運行的程序是哪種程序於是我們可以使用如下的代碼 string path = ;
if (SystemEnvironmentCurrentDirectory == appDomainCurrentDomainBaseDirectory)//Windows應用程序則相等
{
path = AppDomainCurrentDomainBaseDirectory;
}
else
{
path = AppDomainCurrentDomainBaseDirectory + Bin\;
}
這樣如果我們寫了一個類庫類庫中用到了AssemblyLoadFrom由於是通用類庫所以可能用到Windows程序中也可能用到Web中那麼用上面的代碼就很方便了
ServerMapPath
SystemWindowsFormsStartupPath
TypeAssemblyLocation
方法可以應用於控制台應用程序WinForm應用程序Windows服務方法可以應用於Web應用程序方法都可以應用
但方法是加載應用程序的路徑如果是Web應用程序取得的路徑是C:\WINDOWS\MicrosoftNET\Framework\v\Temporary ASPNET Files目錄所以Web項目還是使用ServerMapPath吧否則建議使用方法如果自己新建類庫可以加入對SystemWindowsFormsStartupPath的引用後使用
進程對象在NET中表現為SystemDiagnosticsProcess類通過調用ProcessGetCurrentProcess()MainModuleFileName可獲得當前執行的exe的文件名但是這個方法得到的僅僅是文件名如果程序運行期間沒有切換工作目錄那麼可以調用SystemIOPath的方法獲取絕對路徑但是當前目錄同樣可以通過EnvironmentCurrentDirectory獲得而且很多軟件在使用Open Dialog打開文件的時候都會切換工作目錄而使得這一機制失效
如果是在Windows Forms應用程序中當前應用也表現為SystemWindowsFormsApplication對象通過其靜態屬性ApplicationExecutablePath和ApplicationStartupPath可以取得可執行文件的路徑和啟動路徑
但如果不是在Windows應用中呢或者是在Library中呢就算是Application對象的屬性依然能獲得也需要在工程中添加SystemWindowsForms這個Assembly的引用非常不方便這個時候可以通過Assembly的靜態方法GetCallingAssembly或者GetExecutingAssembly取得當前執行的Assembly然後通過Assembly類的Location獲取assembly的位置
但是使用Assembly的時候可能會遇到權限方面的問題同時AssemblyGetCallingAssembly或者AssemblyGetExecutingAssembly有可能得到的不是exe文件的位置在GAC中的添加了強名的Assembly運行時是可以不必與exe在同一目錄的
NET的進程啟動時會創建AppDomain所有的Assembly都被Load到某一個AppDomain中而AppDomain中提供了SetupInformation屬性可以獲取AppDomain啟動時的一些信息因此可以通過調用AppDomainCurrentDomainSetupInformationApplicationBase獲取當前應用程序所在的路徑
在通過以上方法取到所需的目錄後可以調用SystemIOPath的方法獲取文件名目錄名絕對路徑等停止對路徑字符串的分析而改用SystemIOPath類吧
開發NET下應用程序時了解Process/Application>AppDomain>Assembly的關系對於實現正確的邏輯是非常有幫助的
From:http://tw.wingwit.com/Article/program/net/201311/11363.html