最近在学习研究文件流处理,下面的代码只能对文件进行单一处理,
请问如何把代码改为可以同时对多文件进行处理,
假定fileList: TStringList为文件列表,那如何让这么多文件用流压到一个文件里,再用流的方式分解出来?如何改动下面的参考代码,请大神帮看看。。谢了。
//多文件流合并压缩
procedure ys_File(vfile:string;var Target:TMemoryStream;);
{
vfile: 文件
target: 后输出目标流 》》》
-------------------------------------------------------------
后文件SIZE=原文件SIZE+[INI 压缩信息文件]的SIZE+存储[INI 压缩信息文件]的大小数据类型的SIZE
---------------------------------------------------------------
}
var
tmpstream,inistream:TFileStream;
FileSize:integer;
inifile:TINIFILE;
filename:string;
begin
//打开文件
tmpstream:=TFileStream.Create(vFile,fmOpenread or fmShareExclusive);
try
//向 [临时 压缩文件流] 尾部写入 [原文件流]
Target.Seek(0,soFromEnd);
Target.CopyFrom(tmpstream,0);
//取得文件路径 ,生成 [INI 压缩信息文件]
filename:=ExtractFilePath(paramstr(0))+'tmp.in_';
inifile:=TInifile.Create(filename);
inifile.WriteString('file1','filename',ExpandFileName(pchar(vFile)));//取得全路径
inifile.WriteInteger('file1','filesize',Target.Size);
inifile.WriteDateTime('file1','fileDate',now());
inifile.Free ;
//读入 [INI 压缩信息文件流]
inistream:=TFileStream.Create(filename,fmOpenread or fmShareExclusive);
try
//继续在 [临时 压缩文件流] 尾部加入 [INI 压缩信息文件]
inistream.Position :=0;
Target.Seek(0,sofromend);
Target.CopyFrom(inistream,0);
//计算当前 [INI 压缩信息文件] 的大小
FileSize:=inistream.Size ;
//继续在 [临时 文件尾部] 加入 [INI 压缩信息文件] 的SIZE信息
Target.WriteBuffer(FileSize,sizeof(FileSize));
finally
inistream.Free ;
deletefile(filename);
end;
finally
tmpstream.Free;
end;
end;
//多文件流解压function Tmyzap.UnZabIt(infileName: string;):boolean;
var
inStream,inistream,filestream_ok: TFileStream; outStream:tmemorystream; //临时内存流
inifile:TINIFILE; //临时INI文件
FileSize:integer; // 文件的SIZE
resultvalue:boolean;//返回值begintry
inStream := TFileStream.create(inFIleName, fmOpenRead); try
outStream := tmemorystream.create;
try
jy_stream(insTream,OutStream);
//生成临时INI文件
inistream:=TFileStream.create(ExtractFilePath(paramstr(0))+'tmp.in_', fmCreate);
try
//指向存储解码信息的INTEGER型变量位置
OutStream.Seek(-sizeof(FileSize),sofromend);
//读入变量信息
OutStream.ReadBuffer(FileSize,sizeof(FileSize));
//指向解码信息位置
OutStream.Seek(-(FileSize+sizeof(FileSize)),sofromend);
//将解码信息读入INI流中
inistream.CopyFrom(OutStream,FileSize);
//释放INI文件流
inistream.Free ;
//读入INI文件信息
inifile:=TINIFILE.Create(ExtractFilePath(paramstr(0))+'tmp.in_');
filestream_ok:=TFileStream.create(ExtractFilePath(paramstr(1))+inifile.ReadString('file1','filename','wnhoo.zzz'),fmCreate);
try
OutStream.Position :=0;
filestream_ok.CopyFrom(OutStream,inifile.ReadInteger('file1','filesize',0));
finally
filestream_ok.Free ;
end;
inifile.Free;
finally
//删除临时INI文件
deletefile(ExtractFilePath(paramstr(0))+'tmp.in_');
end; //
finally
OutStream.free;
end;
finally
inStream.free;
end;
except
resultvalue:=false ;end;
result:=resultvalue;
end;
请问如何把代码改为可以同时对多文件进行处理,
假定fileList: TStringList为文件列表,那如何让这么多文件用流压到一个文件里,再用流的方式分解出来?如何改动下面的参考代码,请大神帮看看。。谢了。
//多文件流合并压缩
procedure ys_File(vfile:string;var Target:TMemoryStream;);
{
vfile: 文件
target: 后输出目标流 》》》
-------------------------------------------------------------
后文件SIZE=原文件SIZE+[INI 压缩信息文件]的SIZE+存储[INI 压缩信息文件]的大小数据类型的SIZE
---------------------------------------------------------------
}
var
tmpstream,inistream:TFileStream;
FileSize:integer;
inifile:TINIFILE;
filename:string;
begin
//打开文件
tmpstream:=TFileStream.Create(vFile,fmOpenread or fmShareExclusive);
try
//向 [临时 压缩文件流] 尾部写入 [原文件流]
Target.Seek(0,soFromEnd);
Target.CopyFrom(tmpstream,0);
//取得文件路径 ,生成 [INI 压缩信息文件]
filename:=ExtractFilePath(paramstr(0))+'tmp.in_';
inifile:=TInifile.Create(filename);
inifile.WriteString('file1','filename',ExpandFileName(pchar(vFile)));//取得全路径
inifile.WriteInteger('file1','filesize',Target.Size);
inifile.WriteDateTime('file1','fileDate',now());
inifile.Free ;
//读入 [INI 压缩信息文件流]
inistream:=TFileStream.Create(filename,fmOpenread or fmShareExclusive);
try
//继续在 [临时 压缩文件流] 尾部加入 [INI 压缩信息文件]
inistream.Position :=0;
Target.Seek(0,sofromend);
Target.CopyFrom(inistream,0);
//计算当前 [INI 压缩信息文件] 的大小
FileSize:=inistream.Size ;
//继续在 [临时 文件尾部] 加入 [INI 压缩信息文件] 的SIZE信息
Target.WriteBuffer(FileSize,sizeof(FileSize));
finally
inistream.Free ;
deletefile(filename);
end;
finally
tmpstream.Free;
end;
end;
//多文件流解压function Tmyzap.UnZabIt(infileName: string;):boolean;
var
inStream,inistream,filestream_ok: TFileStream; outStream:tmemorystream; //临时内存流
inifile:TINIFILE; //临时INI文件
FileSize:integer; // 文件的SIZE
resultvalue:boolean;//返回值begintry
inStream := TFileStream.create(inFIleName, fmOpenRead); try
outStream := tmemorystream.create;
try
jy_stream(insTream,OutStream);
//生成临时INI文件
inistream:=TFileStream.create(ExtractFilePath(paramstr(0))+'tmp.in_', fmCreate);
try
//指向存储解码信息的INTEGER型变量位置
OutStream.Seek(-sizeof(FileSize),sofromend);
//读入变量信息
OutStream.ReadBuffer(FileSize,sizeof(FileSize));
//指向解码信息位置
OutStream.Seek(-(FileSize+sizeof(FileSize)),sofromend);
//将解码信息读入INI流中
inistream.CopyFrom(OutStream,FileSize);
//释放INI文件流
inistream.Free ;
//读入INI文件信息
inifile:=TINIFILE.Create(ExtractFilePath(paramstr(0))+'tmp.in_');
filestream_ok:=TFileStream.create(ExtractFilePath(paramstr(1))+inifile.ReadString('file1','filename','wnhoo.zzz'),fmCreate);
try
OutStream.Position :=0;
filestream_ok.CopyFrom(OutStream,inifile.ReadInteger('file1','filesize',0));
finally
filestream_ok.Free ;
end;
inifile.Free;
finally
//删除临时INI文件
deletefile(ExtractFilePath(paramstr(0))+'tmp.in_');
end; //
finally
OutStream.free;
end;
finally
inStream.free;
end;
except
resultvalue:=false ;end;
result:=resultvalue;
end;
一个简单的方法都保存到一个文件里
|文件名大小(int)|文件名|文件大小(dword)|文件内容||文件名大小(int)|文件名|文件大小|文件内容|一个简单的格式即可,计算下偏移量很好分解