如何将tstream读写到ini文件的不同section?(100分)

  • 主题发起人 主题发起人 hbklove8
  • 开始时间 开始时间
H

hbklove8

Unregistered / Unconfirmed
GUEST, unregistred user!
有几个内容不同的stream要把它读写到ini文件中的不同section.

也就是希望写这么两个函数:
saveStreamToiniFile(FileName:string;Section:string;Stream:Tstream;);

restoreStreamFrominiFile(FileName:string;Section:string;stream:Tstream;);
 
注意将STREAM写入ini文件的SECION时,每个节只能写1024字节。以下是我讲tclientDataSet写入INI文件节,以及从节中读出再恢复到CDS的函数,供你参考
Function SaveDataToFile(CDS:TClientDataSet; FileName:String):Boolean;
var ini:TIniFile;
tpVal:OleVariant;
tpStream,tpSt:TMemoryStream;
i:Integer;
begin
Result := False;
if CDS = Nil then
Abort;
if Not CDS.Active then
Abort;
if StrIsEmpty(FileName) then
Abort;
Ini:=TIniFile.Create(FileName);
tpStream:=TmemoryStream.Create;
tpSt:=TmemoryStream.Create;
try
if CDS.State in [DsEdit, dsInsert] then
CDS.Post;
CDS.SaveToStream(tpStream);
tpStream.Position :=0;
//分块写入数据,每块1000字符
For i := 0 to tpStream.Size div 1000 do begin
tpSt.Clear;
tpStream.Position := i*1000;
if (i+1)*1000 < tpStream.Size then
tpSt.CopyFrom(tpStream, 1000)
else
tpSt.CopyFrom(tpStream, tpStream.Size - i * 1000);
tpSt.Position := 0;
ini.WriteBinaryStream(CDS.Name,'Data'+IntToStr(i),tpSt);
end;
Result := True;
Finally
Ini.Free;
tpStream.Free;
tpSt.Free;
End;
end;

Function ReadDataFromFile(CDS:TClientDataSet; FileName:String):Boolean;
var ini:TIniFile;
tpStream:TMemoryStream;
tpList:TStrings;
i:Integer;
begin
Result := False;
if Not FileExists(FileName) then
Abort;
if CDS = Nil then
Abort;
Ini:=TIniFile.Create(FileName);
tpStream:=TmemoryStream.Create;
tpList := TStringList.Create;
try
if Ini.SectionExists(CDS.Name) then begin
Ini.ReadSection(CDS.Name, tpList);
tpStream.Clear;
For i:=0 to tpList.Count - 1 do
if Ini.ValueExists(CDS.Name,tpList.Strings) then begin
tpStream.Position := i * 1000;
ini.ReadBinaryStream(CDS.Name ,tpList.Strings,tpStream);
end;
Result := CopyDataToCDS(CDS,tpStream);
end;
Finally
tpStream.Free;
Ini.Free;
tpList.Free;
End;
end;
 
对的,有大小限制,用XML吧。
 
我在函数中已经把大于1000的流,自动按每个流1000字节分段保存了,读的时候会自动合并回去!
 
先谢谢
少一个方法:CopyDataToCDS
 
CopyDataToCDS这个方法你用不到的,可以直接去掉! 可以用
tpStream.position := 0;
CDS.ReadFromStream(tpStream);
Result := True;

替换掉
 
是呀,后来认真看了代码才发现了,呵呵,谢谢.

明天试试,这样读写好像不太方便,有没有不用"每个节只能写1024字节"的方法呢?

就是要写到INI不要写到XML.

还请高手指教.
 
给分啦!
谢谢Levi!
 
后退
顶部