分享给大家,本人踩到的坑,和解决的办法。谢谢!
本人在使用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);
--------项目中实际用到的代-----结束--------------
|