为什么当前目录改变

Imo*_*lis 4 c windows directory winapi

调用GetOpenFileName进程的当前目录后,更改为文件打开文件的目录GetOpenFileName


如何保留默认的当前目录?

Har*_*ton 5

当前目录存在是因为对于命令行工具来说非常方便。它通常对 GUI 应用程序没有太大用处,这可能是 Microsoft 的开发人员不担心允许 GetOpenFileName() 更改它的原因。当然,偶尔会出现极端情况,您可能正在处理其中一种情况,尽管很难从您所写的问题中看出端倪。(您绝对确定您想要当前目录而不是例如包含可执行文件的目录吗?)

无论如何,如果您确实想要当前目录,最安全的方法是在程序启动后立即检索它,并使用该保存的值来构建完全限定的路径。不要在您认为可能已更改时仅恢复原始当前目录,而是自己构建完全限定的路径。这在多线程代码或将来可能需要多线程的代码(即几乎所有内容)中尤其重要,但它也消除了忽略当前目录可能更改的一个或多个代码路径的风险.


Rem*_*eau 5

如何保留默认的当前目录?

如果您阅读OPENFILENAME文档,则有一个OFN_NOCHANGEDIR用于该确切目的的标志:

如果用户在搜索文件时更改了目录,则将当前目录恢复为其原始值。

尽管文档声称,此标志在GetOpenFileName().

另请参阅 Raymond Chen 关于此主题的博客文章:

为什么公用文件对话框会改变当前目录?

  • `OFN_NOCHANGEDIR` 在对话框关闭时恢复原始工作目录。当用户从对话框内部浏览文件系统时,该对话框仍然可以更改工作目录。 (3认同)
  • @HarryJohnston:工作目录对于进程来说是全局的,并且可以影响多个线程。Raymond 的博客文章中对此有评论:“*当您指定 OFN_NOCHANGEDIR 时,GetOpenFileName 在运行时仍会更改当前目录。唯一的区别是,该标志在函数退出时恢复以前的当前目录。这意味着在对于多线程应用程序,您必须小心,在 GetOpenFileName 运行时不要在其他线程中使用相对路径。*” (3认同)