【问题标题】:I am trying to write to ini files in Delphi but I keep getting errors我正在尝试在 Delphi 中写入 ini 文件,但我不断收到错误消息
【发布时间】:2014-03-18 11:11:59
【问题描述】:

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

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

但是当我运行它时,我得到一个错误提示

Project ALevelMathsTracker.exe 引发异常类 EIniFileException,并带有消息“无法写入 studentALevelMathsTracker.ini”

这是我所在的网络或我的代码有问题吗?

【问题讨论】:

  • 为什么把一个exe的后缀改成.ini?
  • 我按照这个网页delphi.about.com/od/objectpascalide/a/tinifile.htm 给出的建议,在我这样做之前它似乎正在写入文件,但它不会读取。
  • 你没有没有遵循给定链接TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')) ;中的建议。您也可以使用ParamStr(0) => TIniFile.Create( ChangeFileExt( ParamStr(0), '.ini' ) ); 检索应用程序名称。两者都会将完整路径返回到exename。但请注意您是否在应用程序文件夹中具有写入权限
  • 好吧,我想错误信息很清楚!问题是,ini 文件应该存储在哪里?您似乎没有写入该位置的正确权限。
  • ChangeFileExt('StudentALevelMathsTracker.exe','.ini') 毫无意义。您可以将其替换为'StudentALevelMathsTracker.ini'

标签: delphi ini


【解决方案1】:

TIniFile 是 PrivateProfile API 的精简包装器。

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

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

你应该做的是使用SHGetFolderPath(CSIDL_APPDATA)或类似的API来获取用户的AppData文件夹的路径,在它下面创建你自己的子文件夹,然后在那个子文件夹中创建你的.ini文件。

【讨论】:

    【解决方案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 的变量,你就可以在调试器中检查它,如果它被写入的路径不能被写入,因为它不是当前用户有写入权限的位置,那么上面的改变是有道理的。但是,由于我怀疑您在 IDE 中运行,因此问题可能出在其他问题上。

    拥有该变量使您传递给 TIniFile 的值更易于检查,并使您打算编写的逻辑对您更清晰,这使解决方案(对您的代码的更改)对您更明显。

    【讨论】:

      【解决方案3】:

      我刚遇到这个问题,发现 WriteString 内部调用了WritePrivateProfileString,如果结果为假,则引发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;
      

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 2019-05-30
        • 2017-11-10
        • 2015-10-04
        • 1970-01-01
        • 2020-01-21
        • 2021-01-31
        • 2014-05-03
        相关资源
        最近更新 更多