我维护的一个vb.net程序,客户端程序中需要访问客户端程序所在文件夹中的一个txt文档,在程序中我采用Environment. CurrentDirectory 属性来获取当前可执行程序所在的文件夹。程序跑了很久都没有出过问题。不过最近开始发现问题了。
有些电脑上,这个程序需要设置为开机启动(两种方式,1)将程序快捷图标放在开始菜单->程序->启动文件夹中;2)将在注册表的Run子项中添加一项),程序开机启动后,当读取这个文件夹时报错为“无法找到文件路径”,而错误提示的文件路径不是可执行文件所在的路径。
在msdn中对
Environment. CurrentDirectory
是这样解释的:
获取或设置当前工作目录的完全限定路径。我一直以为这个工作目录就是可执行程序所在的文件夹。经过同事的提醒,在VC中的CreateProcess函数中有一个参数为
lpCurrentDirectory,
.net中的
Environment. CurrentDirectory可能就是获取的lpCurrentDirectory。
其实在.net中Process的Start函数中,有一个重载函数是接收一个
ProcessStartInfo对象,此对象可以指WorkingDirectory,而
Environment. CurrentDirectory就是从此参数中获取值。通过调试程序,发现:
1)如果
ProcessStartInfo中
WorkingDirectory为null,则
Environment. CurrentDirectory就是创建进程的程序(就是包含Process.Start代码的程序)所在的目录。
2)如果
WorkingDirectory指定为其它路径,如果改路径存在,则
Environment. CurrentDirectory为
WorkingDirectory。
3)如果
WorkingDirectory指定的路径不存在,但是路径根目录,也就是磁盘盘符存在,则返回
Environment. CurrentDirectory为
WorkingDirectory指定的路径的磁盘盘符,如果磁盘盘符也不存在,则返回%system32%。
那么应该调用什么来获取可执行文件所在文件夹?
应该采用
Application.StartupPath 属性: 获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。