这是我写入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'
这是我的网络问题还是我的代码?
答案 0 :(得分:5)
TIniFile
是PrivateProfile API的瘦包装。
如果您未指定完整路径,则API会创建相对于您可能没有写入权限的OS系统文件夹的.ini文件。
如果您将文件名基于Application.ExeName
或ParamStr(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;