获得与inifile中不同的价值

时间:2014-09-18 05:27:04

标签: file delphi ini

我在windows目录的win.ini文件中放置了一个自定义条目,在自定义[Login]部分下名为LoginCount,并在每次加载主视图时递增。在Form Create事件中,我访问win.ini并检查其值,如果达到1000,我会显示一条消息。但是发生了一件非常奇怪的事情。达到1000后,我手动将其值设置为0.但它仍然显示1000.我检查了路径,以防应用程序引用系统中的某个其他win.ini文件,但它是C:\ Windows \ win.ini 。这是代码:

procedure TfMain.FormCreate(Sender: TObject);
  var
     winIni: TIniFile; 
     windir_buf: array [0 .. 144] of Char;
     WINDIR: string;
     loginCount: integer;
  begin
   GetWindowsDirectory(windir_buf, sizeof(windir_buf));
   WINDIR := StrPas(windir_buf) + '\';

   ShowMessage(WINDIR+'win.ini');//Shows C:\Windows\win.ini

   winIni := TIniFile.Create(WINDIR + 'Win.ini');
   loginCount := winIni.ReadInteger('Login', 'LoginCount', 1);
   ShowMessage(IntToStr(loginCount));//Shows 1000 although it's 0 in the actual file.
  end;

知道为什么吗?

1 个答案:

答案 0 :(得分:5)

这可能是由于文件系统虚拟化造成的。您正在Vista或更高版本下运行虚拟化进程,并且没有对Windows目录的写入权限。

调试这个没有意义。 Win.ini文件已被弃用近20年。你应该:

  1. 添加清单以抑制虚拟化。
  2. 确保您在启用UAC的情况下运行,并以标准用户身份运行。
  3. 将文件存储到适当的文件夹中。在用户配置文件下是显而易见的地方。这使它成为每用户设置。对于系统范围的设置,您将存储到ProgramData文件夹。
  4. 如果您根本无法停止使用Win.ini,那么您仍需要使用 requireAdministrator 选项添加清单。

    如果您打算使用Win.ini(我无法表达您对此考虑的事实的厌恶程度),那么您应该使用GetProfileStringSetProfileString。由于文件是共享的,因此您需要使用同步该访问的函数来访问它。