分享

Delphi中ini文件读取的Value超长问题

 悦光阴 2022-12-26 发布于北京

分享给大家,本人踩到的坑,和解决的办法。谢谢!

本人在使用ini文件做配置时发现,写进去4K个字节,读取到的长度只有2047;

本例子开发的场景:本人的一个软件需要高度的用户自定义功能,ini文件存取开始还是好好的,突然一个界面的内容较多,

加载时发现界面没有按用户自定义的展示啊,读取时做了判断,读取到了字符串不符合规则的都认为是空字符串,不可能啊,按规则存进去的怎么可能出错,查看ini文件的某个键值没有任何问题啊,

然后下断点调试了一下,发现直接从Ini文件中读出来的字符串不完整.......怎么办?

----------------解决这个问题的部分测试代码---开始----Delphi 7-----

test.ini没有上传。

这部分代码只是测试的时候写的,在此处没有任何问题

procedure TForm1.Button4Click(Sender: TObject);
var
//要Uses Inifiles
vini:Tinifile;
//Buffer: array[0..8191] of Char;
Buffer: Pchar;
Default,vResult:string;
vbuffer:array of PChar;
begin
//PChar(ExtractFilePath(ParamStr(0))
vini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'test.ini');
Default:='A';
//vini.ReadString()
//SetLength(vbuffer,8192);
GetMem(Buffer,2048 * 4);
FillChar(Buffer^,2048 * 4,#0);
//Buffer:=PChar(vbuffer);
SetString(vResult, Buffer, GetPrivateProfileString(PChar(Edit3.Text ), //Edit3.Text 小节
PChar('FormFilterSet'), PChar(Default), Buffer, 2048 * 4, PChar(TCustomIniFile(vini).filename ))); //'FormFilterSet'键 ,Default是默认值
memo1.Lines.Add(vResult);
memo1.Lines.Add('---------------------------');
//memo1.Lines.Add(FFileName);
FreeMem(Buffer,2048 * 4);

end;

-----------解决这个问题的部分测试代码-----结束----------

--------项目中实际用到的代码---开始---------Delphi XE--------

/// <summary>
/// ini文件的Value很长,不能全部读取,请使用此函数
/// <param name="Section">小节 String类型</param>
/// <param name="IniKey">键名 String类型</param>
/// <param name="DefaultValue">默认值 String类型</param>
/// <param name="IniFileName">文件名 String类型</param>
/// <param name="KiloBytes">千字节 Byte类型默认读取8K字节</param>
/// </summary>
function IniFileReadStringEx(const Section, IniKey, DefaultValue,IniFileName:string;KiloBytes:Byte=8):string;

 

//实现部分

function IniFileReadStringEx(const Section, IniKey, DefaultValue, IniFileName: string; KiloBytes:Byte=8):string;
var
Buffer:PChar;
//vBuffer:array of Char;
begin

//if KiloBytes<8 then
// KiloBytes:=8;
Buffer:=StrAlloc(1024*KiloBytes);
SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
PChar(IniKey), PChar(DefaultValue), Buffer,1024*KiloBytes, PChar(IniFileName)));
StrDispose(Buffer);
{ 这个也行

GetMem(Buffer,1024*KiloBytes);
FillChar(Buffer^,1024*KiloBytes,#0);
SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
PChar(IniKey), PChar(DefaultValue), Buffer,1024*KiloBytes, PChar(IniFileName)));
FreeMem(Buffer,1024*KiloBytes); }

{这个也可以

SetLength(vBuffer,1024*KiloBytes);
Buffer:=PChar(vBuffer);
SetString(Result, Buffer, GetPrivateProfileString(PChar(Section),
PChar(IniKey), PChar(DefaultValue), Buffer,1024*KiloBytes, PChar(IniFileName)));
SetLength(vBuffer,0);}


end;

 

//调用 //这个调用的变量我就不解释了,结合测试部分的代码就能完全看懂

vStr:=SysPubMethod_u.IniFileReadStringEx(SettingName,'FormFilterSet','{}',TCustomIniFile(FFormIniFile).FileName);

--------项目中实际用到的代-----结束--------------

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多