关于C#程序路径的问题
2010-04-14 17:41
211 查看
关于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的关系,对于实现正确的逻辑,是非常有帮助的。
总结[b]C#中得到程序当前工作目录和执行目录的一些方法[/b]
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一样。
相关文章推荐
- 转:关于C#程序路径的问题
- [C#]关于调用Office应用程序后,程序不退出的问题
- C#/.NET中关于目录路径的问题
- 关于C和C++,还有c#,还有java程序的速度问题!
- 关于C#程序调用AMFPHP服务的问题!!
- C# 关于使用OpenFileDialog 默认路径被重置的问题。
- 使用ajax请求后端程序时,关于目标程序路径问题
- C#程序中的路径问题
- 关于C和C++,还有c#,还有java程序的速度问题!(二)
- C# 连接FTP 时 关于路径的问题
- 关于在主程序里面调用DLL时,找不到DLL里面的路径问题
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
- 关于C和C++,还有c#,还有java程序的速度问题!(三)
- 关于C#的WinForm程序打包的问题
- 调试用Python C API 写的程序问题还真多,关于import搜索路径的,复制过来,以防忘记
- 关于C#连接FTP时路径问题的解决方法
- (.net,c#,winform)获取程序所在路径的问题
- 将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题
- C#写的计数器控件 - 一个关于相对路径使用的问题
- 关于编译android程序,期待模拟器,中文路径的问题【转载】