获取当前程序文件的路径也算是一个比较常见的需求比如我有一个文件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的关系对于实现正确的逻辑是非常有帮助的