获得与inifile中不同的价值

Mik*_*yev 0 delphi ini file

我在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;
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

Dav*_*nan 5

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

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

  1. 添加清单以抑制虚拟化.
  2. 确保在启用UAC的情况下运行,并以标准用户身份运行.
  3. 将文件存储到适当的文件夹.在用户配置文件下是显而易见的地方.这使它成为每用户设置.对于系统范围的设置,您将存储到ProgramData文件夹.

如果您根本无法停止使用Win.ini,那么您仍然需要使用requireAdministrator选项添加清单.

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

  • 我根本不说 (2认同)