Delphi 10.4 Community Edition中inifile.ReadString未返回预期默认值
Delphi中TIniFile.ReadString()返回空字符串而非默认值的原因及解决方法
问题场景
你创建的INI文件包含指定节和键,但键对应的值为空(如DriveLetter = ),调用ReadString方法时,返回的是空字符串'',而非你传入的默认参数'Missing_Value',这和你理解的官方文档描述不符。
核心原因
TIniFile的ReadString方法逻辑与你对文档的理解有偏差:
- 官方文档中提到的"节、键或值缺失时返回默认值",其中的**"值缺失"指的是键不存在的情况**;
- 如果键存在但对应的值为空(即键名后只有等号,没有实际内容),
ReadString会返回空字符串,这是设计后的预期行为,并非Bug。
解决办法
方法1:手动检查并替换空值
读取后判断返回值是否为空,若为空则替换为默认值:
begin if not FileExists(INI_NAME) then CreateDefaultInifile(INI_NAME); var ini := TIniFile.Create(INI_NAME); try var value := ini.ReadString(DRIVE_SECTION, DRIVE_LETTER, 'Missing_Value'); // 处理空值情况 if value.IsEmpty then value := 'Missing_Value'; ShowMessage(value); finally ini.Free; end; end.
方法2:避免生成空值键
创建INI文件时,要么不添加该键(这样读取时会触发默认值),要么直接赋予初始默认值:
procedure CreateDefaultInifile(const IniName: TFileName); var slist: TStringList; begin slist := TStringList.Create; try slist.Add('[' + DRIVE_SECTION + ']'); // 要么不添加DriveLetter键,要么赋予默认值 slist.Add(DRIVE_LETTER + ' = Missing_Value'); slist.SaveToFile(IniName); finally slist.Free; end; end;
方法3:封装自定义读取函数
如果需要频繁处理这种场景,可以封装一个函数统一处理:
function IniReadStringWithDefault(Ini: TIniFile; const Section, Key, Default: string): string; begin Result := Ini.ReadString(Section, Key, Default); if Result.IsEmpty then Result := Default; end; // 使用示例 ShowMessage(IniReadStringWithDefault(ini, DRIVE_SECTION, DRIVE_LETTER, 'Missing_Value'));
内容的提问来源于stack exchange,提问作者tua
相关产品推荐
相关产品推荐

