Windows存储INI文件的替代文件(Delphi 7)位于哪里?

4

我通常会在应用程序自己的文件夹中保存一个INI文件来编写Delphi应用程序:

ConfigFile:= ChangeFileExt(ParamStr(0), '.ini');
IniFile:= TIniFile.Create(ConfigFile);

try
  with IniFile do
  begin
    // etc

然而,我正在编写一个特定的应用程序,我想使用安装向导(Inno),并让用户有机会将应用程序安装在Program Files(x86)\ MyProg中。
对我来说新的是,Windows不会将INI文件保存在安装目录中,而是“其他地方”。
通过控制面板卸载应用程序成功从Program Files(x86)文件夹中删除所有项目(包括文件夹),但与许多程序一样,如果重新安装,则会恢复所有配置设置。因此,它们必须存储在控制面板|卸载不删除的某个地方。
所以我的问题是在哪里?
谢谢, 约翰。

UAC文件夹虚拟化 - Dalija Prasnikar
3
你的应用程序通过向Program Files中写入内容违反了Windows的指南。自Vista发布以来(实际上是XP,但直到Vista才开始执行),这就被禁止了。对Program Files的写入操作会被虚拟化到另一个文件夹中。即使你选择使用一个15年前的开发工具,也需要调整你的软件以适应现代操作系统的版本。 - Ken White
3
停止寻找文件,了解11年前引入的Vista中进行的更改。然后添加一个应用程序清单,停止虚拟化,并将文件存储在用户配置文件夹中。 - David Heffernan
2
“如何使Delphi程序支持Vista系统”(正如David所说,这篇文章已经十年以上了)应该会有所帮助。 - Ken White
1
嗨约翰,我建议你学习如何明确指定现代位置来存储配置文件,而不是将其扔进UAC文件夹虚拟存储中,这正是你刚刚做的事情。 - Warren P
显示剩余3条评论
1个回答

3

非管理员用户禁止在Program Files文件夹下写入文件。如果以非管理员用户身份运行的应用程序尝试在那里写入文件,并且该应用程序没有UAC清单,则Windows会保护Program Files文件夹并将所有访问静默重定向到用户配置文件中的VirtualStore文件夹。

Windows Vista或Windows 7中常见的文件和注册表虚拟化问题

Windows 7应用程序兼容性问题...揭秘!!!

在这种情况下,当您将INI写入此文件时:

C:\Program Files (x86)\MyProg\MyProg.ini

它实际上被写入了这个文件:
%USERPROFILE%\AppData\Local\VirtualStore\Program Files (x86)\MyProg\MyProg.ini

你应该将应用程序更改为将INI文件存储在更合适的位置,例如:

%LOCALAPPDATA%\MyProg\MyProg.ini

或者:

%PROGRAMDATA%\MyProg\MyProg.ini

如果我要针对多个操作系统版本开发,应该将数据和配置文件存储在哪里?


1
但是,如上所述,请更改您放置ini文件的位置。 - Gerry Coll
@GerryColl:是的,正确的解决方案应该是改变应用程序的行为方式,以便与UAC协作。Program Files重定向是为了保护系统免受编写不良代码的影响,这些代码会将文件写入它们不属于的位置。在这种情况下,该文件应位于用户的配置文件中,例如%LOCALAPPDATA%\MyProg\MyProg.ini。但OP没有问为什么文件被写入其他地方,OP问的是文件被写入哪里。我在我的答案中都回答了。 - Remy Lebeau
我尝试添加了UAC清单,但程序会要求运行权限,这对应用程序来说不太合适。我需要它能够从启动文件夹自动运行。 我也喜欢我的程序是“便携式”的,因此我通常更喜欢将INI保存在同一文件夹中。 我做了一个妥协,即当MyProg安装在程序文件中时,INI保存在MyDocuments\MyProg\MyProg.ini中,否则与exe一起保存。 - vwlowen
只有当您将 requestedExecutionLevel 设置为 highestAvailablerequireAdministrator 时,才会提示您进行权限确认。在这种情况下,asInvoker 就足够了。MyDocuments 应仅用于用户可以使用的文件。应用程序使用的文件应放在 AppDataProgramData 中。您不应根据应用程序安装位置选择不同的文件夹。停止违反规则,这样只会让自己更加困难。Microsoft 为此设置了这些特殊文件夹。 - Remy Lebeau
我已经在“我的文档”中创建了一个目录,并创建了三个子目录来保存用户创建的数据,但我已将INI文件移动到AppData\Roaming\MyProg\Settings\MyProg.ini。我已经将uac.res文件放回asInvoker。我已设置了一个固定的文件夹位置 - 正如你所说,我真的让自己变得更难。程序允许用户选择不同的文件夹来存储用户创建的数据。一切都解决了。谢谢。 - vwlowen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接