我写了这个需要检查INI文件(“preference.ini”)的C ++应用程序,并最终修改它(例如,如果用户不想再看到介绍表单)。我在WinXP中创建它,它在我编译它的系统上工作正常(在很多地方,包括“Program Files”)。
问题:
我使用'getcwd'来定义运行时的路径,并且我验证它是正确的,即使在“Program Files(x86)”下:
char currentPath[MAXPATH];
getcwd(currentPath, MAXPATH);
std::string licensePath(currentPath);
licensePath.append("\\dat\\preference.ini");'
有什么想法吗?在此先感谢您的帮助。
答案 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)
我觉得licensePath
:getcwd()
+ "\\dat\\preference.ini"
不是您所期望的。
记录此值(控制台或日志文件),看看从不同文件夹运行程序时licencePath
的确切值是什么。
答案 3 :(得分:0)
这篇文章是关于游戏开发的,但最好的描述了我能够找到的如何以及为什么会这样做
http://msdn.microsoft.com/en-us/library/ee419001(VS.85).aspx
文章中的这一段描述了最有可能发生的事情 -
尝试创建或编写文件 或文件夹下的目录 不授予写入权限 进程将在Windows Vista下失败 如果申请没有 行政特权。如果你的 正在运行32位游戏可执行文件 传统模式,因为它没有 声明请求的执行级别, 它的写操作会成功,但是 他们将受到 如下所述的虚拟化 “UAC与老年人的兼容性”一节 游戏“在本文后面。