我试图写入Delphi中的ini文件,但我一直在收到错误

时间:2014-03-18 11:11:59

标签: delphi ini

这是我写入ini文件的代码。

 Ini := TIniFile.Create(ChangeFileExt('StudentALevelMathsTracker.exe','.ini')) ;
 try
   Ini.WriteString('Settings', 'FilePath', edtFilePath.text);
   Ini.UpdateFile;
 finally
   Ini.Free;
 end;

然而,当我跑这个时,我得到一个错误说

  

项目ALevelMathsTracker.exe引发异常类EIniFileException并显示消息'无法写入studentALevelMathsTracker.ini'

这是我的网络问题还是我的代码?

3 个答案:

答案 0 :(得分:5)

TIniFile是PrivateProfile API的瘦包装。

如果您未指定完整路径,则API会创建相对于您可能没有写入权限的OS系统文件夹的.ini文件。

如果您将文件名基于Application.ExeNameParamStr(0),则表示您正在创建相对于应用程序文件夹的.ini文件,该文件夹可能没有写入权限,尤其是该应用安装在Program Files下。

您应该使用SHGetFolderPath(CSIDL_APPDATA)或类似的API来获取用户的AppData文件夹的路径,在其下创建自己的子文件夹,然后在该子文件夹中创建.ini文件。< / p>

答案 1 :(得分:2)

首先,你应该做变量,所以你自己可以阅读正在发生的事情:

procedure TForm1.MyProc;
var
  Ini:TIniFile;
  FileName: string;
begin
  // probably can not write to this directory:
  //FileName :=  ChangeFileExt('StudentALevelMathsTracker.exe','.ini');
  FileName := 'c:\afolder_i_have_permission_to_write_to\StudentALevelMathsTracker.ini';

  Ini := TIniFile.Create(FileName) ;
 try
   Ini.WriteString('Settings', 'FilePath', edtFilePath.text);
   Ini.UpdateFile;
 finally
   Ini.Free;
 end;
end;

一旦你有了一个名为FileName的变量,你就可以在调试器中检查它,如果它被写入的路径无法写入,因为它不是当前用户写的priveleges的位置,那么改变是有道理的。但是,由于我怀疑你在IDE中运行,问题可能是其他问题。

使用变量使您传递到TIniFile的值更容易检查并使您想要写入的逻辑更清晰,这使得解决方案(对代码的更改)对您来说更加明显。

答案 2 :(得分:1)

我刚遇到这个问题,发现WriteString在内部调用WritePrivateProfileString,如果结果为false,则会引发EIniFileException,这有效地隐藏了失败的真正原因。

因此,您可以将代码封装在Try Except块中,并调用RaiseLastOsError以显示Windows试图提醒您的错误。

这有助于追踪此类错误的问题。

try
  Ini.WriteString('Settings', 'FilePath', edtFilePath.text);
  Ini.UpdateFile;
except
  on EIniFileException do
  begin
    // This will raise an EOSError Exception with a better message.
    RaiseLastOsError;
  end;
end;