无法访问“程序文件”中的INI文件

时间:2010-07-07 05:16:34

标签: c++ windows file permissions

我写了这个需要检查INI文件(“preference.ini”)的C ++应用程序,并最终修改它(例如,如果用户不想再看到介绍表单)。我在WinXP中创建它,它在我编译它的系统上工作正常(在很多地方,包括“Program Files”)。

问题:

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

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

    有什么想法吗?在此先感谢您的帮助。

4 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

我觉得licensePathgetcwd() + "\\dat\\preference.ini"不是您所期望的。

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

答案 3 :(得分:0)

这篇文章是关于游戏开发的,但最好的描述了我能够找到的如何以及为什么会这样做

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

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

  

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