【问题标题】:Why the current directory changes为什么当前目录发生变化
【发布时间】:2017-05-05 19:14:29
【问题描述】:

调用GetOpenFileName后,进程的当前目录变为GetOpenFileName打开的文件所在目录。


我怎样才能保留默认的当前目录?

【问题讨论】:

  • 保存它,然后在调用返回后恢复它。虽然这回答了您的问题,但您真正应该做的不是完全依赖当前的工作目录。你只是经历了一个原因,为什么。
  • 我需要快速在本地目录中创建文件,因为同一目录中的另一个程序只能打开本地文件,这就是两个程序相互通信的方式。顺便谢谢。
  • 那么,继续创建您需要的所有文件。但是,您为什么坚持认为这需要依赖当前的工作目录?
  • 今天节省 15 分钟将花费您数天、数周甚至数月的时间来支持您故意实施的错误。什么样的 “可移植性” 依赖于不变量,不是吗?
  • 这是每个搜索引擎都能为您找到的东西。

标签: c windows winapi directory


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    如果您阅读了OPENFILENAME documentation,则有一个OFN_NOCHANGEDIR 标志用于此目的:

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

    尽管文档声称,GetOpenFileName() 支持此标志。

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

    Why does the common file dialog change the current directory?

    【讨论】:

    • 嗯。文档说该标志会导致当前目录恢复到其原始值,但 Raymond 的文章说它会阻止当前目录被更改;你碰巧知道在实践中实际发生了什么吗? (当然,这对单线程程序无关紧要。)
    • 我看文章,我不复制粘贴示例代码。我忽略了它,因为它说它不会有任何效果。我应该记得 winapi doc 是一个糟糕的文档示例。
    • OFN_NOCHANGEDIR 在对话框关闭时恢复原始工作目录。当用户在对话框内浏览文件系统时,对话框仍然可以更改工作目录。
    • 好的,谢谢。这意味着该解决方案仅在只有 GUI 线程使用当前目录的情况下才能正常工作,而且我想如果您在处理时打开文件(例如计时器消息),您也可能会自欺欺人。 (这对于 OP 来说可能没问题,我只是为了未来读者的利益而提到它。)
    • @HarryJohnston:工作目录对进程来说是全局的,可以影响多个线程。 Raymond 的博客文章中对此有评论:“当你指定 OFN_NOCHANGEDIR 时,GetOpenFileName 在运行时仍然会改变当前目录。唯一的区别是这个标志会在函数退出时恢复之前的当前目录。这意味着在多线程应用程序中,您必须注意在 GetOpenFileName 运行时不要在其他线程中使用相对路径。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多