delphi ----分块解压,压缩代码实现
procedure decompressfileEx(filename, targetpath: string);
const
C_SIZE = 1000000; // 1000000; //字节数大约为1M大小
var
InStream, OutStream: TmemoryStream;
ZStream: TdeCompressionStream;
ASize: Integer; //原始文件大小
i, BlockCount, ModSize: integer; //文件块数,余数
buffer: pchar; //解压块缓存
d: string; //解压后的文件路径
begin
try
BlockCount := 0;
ModSize := 0;
InStream := TMemoryStream.Create;
InStream.LoadFromFile(filename);
try
OutStream := TMemoryStream.Create;
InStream.Position := 0;
InStream.Read(ASize, SizeOf(ASize)); //读出压缩文件原始大小
ZStream := TDecompressionStream.Create(InStream);
try
BlockCount := Asize div C_SIZE; //计算出块数
ModSize := Asize mod C_SIZE; //计算出余数
for i := 1 to BlockCount do begin //分片解压
application.ProcessMessages;
GetMem(Buffer, C_SIZE); //分配内存
ZStream.Read(Buffer^, C_SIZE); //把解压流中的数据读C_SIZE个到内存Buffer中,解压对象在读出数据的同时会自动解压文件
OutStream.Write(Buffer^, C_SIZE); //把内存中的数据写count个到destStream中去
FreeMem(Buffer);
end;
if ModSize > 0 then begin //如果有余数则把余下大小解压
GetMem(Buffer, ModSize); //分配内存
ZStream.Read(Buffer^, ModSize); //把解压流中的数据读C_SIZE个到内存Buffer中,解压对象在读出数据的同时会自动解压文件
OutStream.Write(Buffer^, ModSize); //把内存中的数据写count个到destStream中去
FreeMem(Buffer);
end;
OutStream.Position := 0;
finally
ZStream.Free;
end;
if not directoryexists(targetpath) then forcedirectories(targetpath);
d := targetpath + extractfilename(filename);
if fileexists(d) then deletefile(d);
OutStream.SaveToFile(d);
finally
outstream.Free;
end;
finally
InStream.Free;
end;
end;