【问题标题】:Where does Windows store its alternative to the INI file (Delphi 7)Windows 将其替代 INI 文件存储在哪里(Delphi 7)
【发布时间】:2016-09-13 13:37:24
【问题描述】:

我通常使用保存在应用程序自己文件夹中的 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) 文件夹(包括文件夹)中的所有项目,但是 - 与许多程序一样 - 如果重新安装,所有配置设置都会恢复.所以它们必须存储在控制面板 |卸载不会删除。

所以我的问题是在哪里?

谢谢, 约翰。

【问题讨论】:

  • 您从应用程序写入 Program Files 违反了 Windows 准则。自 Vista 发布以来,这已被禁止(实际上是 XP,但直到 Vista 才强制执行)。对程序文件的写入被虚拟化到不同的文件夹。即使您选择使用已有 15 年历史的开发工具,您也需要调整您的软件以跟上现代版本的操作系统。
  • 停止查找文件并了解 11 年前在 Vista 中引入的更改。然后添加应用清单,停止虚拟化,并将文件存储在用户配置文件下。
  • How to make Delphi programs Vista-aware(正如大卫所说的已有十多年的历史)应该会有所帮助。
  • 嗨,John,我建议您了解如何为您的配置文件明确指定一个现代位置,而不是像您刚才所做的那样将它扔到 UAC 文件夹虚拟存储中。

标签: delphi registry


【解决方案1】:

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

Common file and registry virtualization issues in Windows Vista or in Windows 7

Windows 7 Application Compatibility Issues …Demystified !!!

在这种情况下,当您将 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

Where Should I Store my Data and Configuration Files if I Target Multiple OS Versions?

【讨论】:

  • 但是,如上所述,更改您放置 ini 文件的位置。
  • @GerryColl:是的,正确的解决方案是改变应用程序的行为方式以与 UAC 配合使用。 Program Files 重定向是为了保护系统免受编写错误的代码的影响,这些代码将文件写入不属于它们的位置。在这种情况下,该文件属于用户的配置文件,例如 %LOCALAPPDATA%\MyProg\MyProg.ini。但是 OP 没有问 WHY 文件正在其他地方写入,OP 询问 WHERE 文件正在写入。我在回答中都提到了。
  • 我确实尝试添加一个 UAC 清单,但程序随后会请求运行我认为不适合该应用程序的权限。我需要它能够从 Startup 文件夹自动运行。我也喜欢我的程序是“便携的”,因此我通常更喜欢将 INI 保存在同一个文件夹中。我做了一些妥协,当 MyProg 安装在程序文件中时,INI 保存在 MyDocuments\MyProg\MyProg.ini 中,否则,它与 exe 一起保存。
  • 只有将requestedExecutionLevel 设置为highestAvailablerequireAdministrator 时,才会提示您授予权限。在这种情况下,asInvoker 就足够了。 MyDocuments 应该只用于用户可以使用的文件。应用程序使用的文件属于AppDataProgramData。您不应该根据应用的安装位置选择不同的文件夹。停止与规则作斗争,你让事情变得更难了。 Microsoft 将这些特殊文件夹放在一边是有原因的。
  • 我已经在“我的文档”中创建了一个包含三个子目录的目录来保存用户创建的数据,但我已将 INI 文件移至 AppData\Roaming\MyProg\Settings\MyProg.ini。我已经使用 asInvoker 将 uac.res 文件放回原处。而且我已经设置了一个固定的文件夹位置——正如你所说,我真的让自己的事情变得更难了。该程序允许用户为用户创建的数据选择不同的文件夹。都整理好了。谢谢。
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多