【问题标题】:File I/O from current Windows position C++从当前 Windows 位置 C++ 的文件 I/O
【发布时间】:2011-09-13 06:13:18
【问题描述】:

我还没有找到一个明确的答案。我正在尝试从我的 .EXE 访问子文件夹中的文件。当我之前问过时,如果我想访问 /info/ 中的某些内容,人们会告诉我使用绝对位置,即“c:/game/info/”

但是对于我或任何人来说,假设某人将使用同一目录中的程序是完全不合理的。如果用户只有一个 D 盘怎么办?那种东西。

所以我的问题是:如何在不依赖整个路径的情况下从可执行文件访问子目录中的文件?

【问题讨论】:

  • 忽略那些人。你不使用绝对路径是对的。
  • @Martinho:他不应该使用硬编码绝对路径。他应该使用绝对路径。

标签: c++ winapi file-io path


【解决方案1】:

制作或使用一个安装程序,询问用户在哪里安装可执行文件,并将该路径写入注册表中一个众所周知的位置以供以后参考。

【讨论】:

    【解决方案2】:

    你的标题是“Windows”,所以我会给出一个特定于 WinAPI 的答案。

    在 Windows 上,您可以使用 GetModuleFileName(NULL, ...)PathRemoveFileSpec 找到您的应用程序目录。然后PathAppend 将生成您的数据文件的完整路径。

    或者您可以将 .exe 文件中的数据存储为 Win32 resources,这样它们就永远不会分开。


    请注意,这种方法通常仅适用于对数据文件的只读访问。如果您尝试在应用程序目录中写入文件,您可能会被 ACL 阻止(取决于计算机的安装位置和本地安全设置)。

    【讨论】:

    • 谢谢本。正是我需要的。
    • 这不适用于 Vista 及更高版本上的大多数应用程序 - 用户无法写入程序文件目录。
    • @Larry:没有人提到写作。
    • 好点。但是太多的人认为他们可以写入包含他们的应用程序的目录,所以......
    • @Larry:是的。但是,如果有的话,从 Vista 开始,由于重定向,这不太容易。在 XP 上,如果非管理员尝试写入“程序文件”目录,则会失败。 (当然,应用程序不需要安装到%SYSTEMROOT%\Program Files,而且不支持在用户的配置文件目录下进行非特权的每用户安装,这真是太可惜了。我讨厌为从网络下载的安装程序授予更高的管理员权限。)
    【解决方案3】:

    使用GetModuleFileName(检索包含指定模块的文件的完全限定路径。该模块必须已被当前进程加载。)

    char strExePath [MAX_PATH];
    GetModuleFileName (NULL, strExePath, MAX_PATH);
    

    然后您需要提取文件夹路径(有人已经发布了如何执行此操作),并组合您的路径。

    【讨论】:

      【解决方案4】:

      如果你使用:

      #include <fstream>
      
      ifstream stream("file");
      

      它会工作的。 “文件”是您的 exe 目录中的文件。当然,如果您想在文件夹层次结构中上移或下移,请使用“..\file”或“folder\file”

      【讨论】:

      • 它可能工作也可能不工作,这取决于当前工作目录是否是应用程序目录。
      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多