调用 GetOpenFileName
后,进程的当前目录会更改为由 GetOpenFileName
打开的文件所在的目录。
如何保留默认的当前目录?
调用 GetOpenFileName
后,进程的当前目录会更改为由 GetOpenFileName
打开的文件所在的目录。
如何保留默认的当前目录?
OPENFILENAME
文档,就会发现有一个OFN_NOCHANGEDIR
标志,用于这个确切的目的:恢复当前目录为其原始值,如果用户在搜索文件时更改了目录。尽管文档声称这个标志在GetOpenFileName()
中得到支持。此外,还可以参考雷蒙德·陈(Raymond Chen)关于这个主题的博客文章:为什么通用文件对话框会改变当前目录?
OFN_NOCHANGEDIR
选项在对话框关闭时恢复原始工作目录。用户在对话框内浏览文件系统时,仍然可以更改工作目录。 - Remy Lebeau当前目录之所以存在,是因为对于命令行工具非常方便。对于 GUI 应用程序而言,它通常没有太多用处,这可能就是微软开发人员没有考虑让 GetOpenFileName() 更改它的原因。当然也有偶尔会使用到它的边缘情况,但是从你的问题中很难确定是否属于该情况。(你确定你需要的是当前目录,而不是包含可执行文件的目录吗?)
无论如何,如果你确实需要当前目录,最安全的方法是在程序启动时检索它,并使用保存的值构造完全合格的路径。不要仅仅在你认为可能已经更改了当前目录时恢复原始的当前目录,而是自己构建完全合格的路径。这在多线程代码或未来可能需要成为多线程的代码中尤其重要(即几乎所有情况),这也消除了忽略一个或多个可能更改当前目录的代码路径的风险。