if mem_f.copyfrom(src_f,afilelen)<>afilelen then raiselastwin32error; //获取压缩流
mem_f.position := 0;
lhaexpand(mem_f,dst_f); //解压
finally
dst_f.free;
mem_f.free;
end;
except
result:=false;
end;
end;
var
afilename:string;
fnlen,fsize:integer;
begin
if not fileexists(lhfile) then exit; //压缩文件不存在! filepack.lhz
result:=true;
try
src_f := tfilestream.create(lhfile,fmopenread);
//从临时文件中分离出所有文件的实体
//src_f 源文件流: 文件名长度 + 文件名 + 文件压缩长度 + 压缩流(被压文件)
try
src_f.position := 0;
while true do begin
if src_f.size <=src_f.position+1 then break; //(2.0)如果 irtn<=0 则文件流读取结束
if src_f.read(fnlen,sizeof(integer))<=0 then break; //(2.1)取得文件名长度
setlength(afilename,fnlen);
if src_f.read(afilename[1],fnlen)<=0 then break; //(2.2)取得文件名
if src_f.read(fsize,sizeof(integer))<=0 then break; //(2.3)取得压缩长度
if getonefile(fsize,afilename) then //(2.4)获取压缩文件
begin
frmmsg.momsgs.lines.add(afilename+' 解压缩成功!'); frmmsg.update ;
end else
begin
frmmsg.momsgs.lines.add(afilename+' 解压缩不成功!'); frmmsg.update ;
end;
end;
finally
src_f.free;
end;
except
result:=false;
end;