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;

 

posted @ 2010-07-09 09:00  你的影子  阅读(407)  评论(0编辑  收藏  举报