【问题标题】:Cannot access INI files in "Program Files"无法访问“程序文件”中的 INI 文件
【发布时间】:2011-03-12 15:34:37
【问题描述】:

我编写了这个 C++ 应用程序,它需要检查一个 INI 文件(“preference.ini”),并最终修改它(例如,如果用户不想再看到介绍表单)。我在 WinXP 中创建它,它在我编译它的系统上运行良好(在许多位置,包括“程序文件”)。

问题:

  1. 在 Win 7 中,如果我将完整的程序文件夹放在“C”:\”下(例如“C:\MyProgram”),它可以正常工作,但如果我把它放在“C:\Program Files (x86)\ MyProgram”,它只是检索一些神秘的数据(我的 INI 文件中不存在的值)。当我更改一些设置并将它们保存到文件时,它(显然)保存更改(没有错误,但是当我去打开文件时更改不存在......
  2. 我在使用另一个 WinXP 系统(不是我编译它的那个系统)的系统上遇到了一些类似的问题。

我使用 'getcwd' 在运行时定义路径,并且我验证它是正确的,即使在“Program Files (x86)”下也是如此:

char currentPath[MAXPATH];
getcwd(currentPath, MAXPATH);
std::string licensePath(currentPath);
licensePath.append("\\dat\\preference.ini");'

有什么想法吗?提前感谢您的帮助。

【问题讨论】:

    标签: c++ windows file permissions


    【解决方案1】:

    这可能与 Windows 使用文件系统的虚拟化有关。你可以阅读here 来了解它。检查您的 INI 文件是否位于 <root>\Users\<User_name>\AppData\Local\VirtualStore

    【讨论】:

      【解决方案2】:

      答案正如@Kirill 已经说过的那样 - Win7 不会让您将数据写入程序文件,除非您具有高于正常权限(以管理员身份运行)。在这种情况下,它可能会重定向您的文件写入,以便它们仍然可以工作,但数据本身并未存储在 Progam 文件中。

      补充他的回答:一般情况下(除非您想以管理员身份运行您的应用程序),您不应将任何程序数据写入 Program Files 文件夹。

      应用程序设置应存储在 AppData 文件夹之一中。您可以通过转到开始菜单搜索框 (Vista/Win7) 并输入 %appdata% 来手动获取用户的应用数据。

      要在您的代码中查找此位置,请将 SHGetFolderPath 与 CSIDL_APPDATA(当前用户)或 CSIDL_COMMON_APPDATA(所有用户)一起使用。

      【讨论】:

      • @Michael:糟糕,抱歉。忘记检查语言了!更正以描述所需的 C++ 代码。感谢您指出这一点。
      【解决方案3】:

      在我看来 licensePath: getcwd() + "\\dat\\preference.ini" 不是你所期望的。

      记录这个值(控制台或日志文件),看看licencePath从不同文件夹运行程序时的确切值是多少。

      【讨论】:

        【解决方案4】:

        这篇文章是关于游戏开发的,但我找到了关于如何以及为什么会发生这种情况的最佳描述

        http://msdn.microsoft.com/en-us/library/ee419001(VS.85).aspx

        文章中的这一段描述了最有可能发生的事情 -

        尝试创建或写入文件 或文件夹下的目录 不授予写权限 在 Windows Vista 下进程将失败 如果应用程序没有 管理权限。如果你的 32 位游戏可执行文件正在运行 传统模式,因为它没有 声明请求的执行级别, 它的写操作会成功,但是 他们将受到 虚拟化,如 “UAC 与旧版本的兼容性”部分 游戏”在本文后面。

        【讨论】:

          猜你喜欢
          • 2011-06-13
          • 1970-01-01
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多