帮我看看这篇文章,好吗?拜托你了
http://www.yesky.com/20030311/1656296_1.shtml
执行解压缩的时候到下面这句就出错了,说是“stream write error”,我用的是Delphi7。
DestStream.WriteBuffer(Buffer^,Count);这是我的程序
function TdataM.zipFile(sourceFile, destFile: string): boolean;
var
  FileNameStream,Deststream:TMemoryStream;
  SourceStream:TCompressionStream;
begin
  result:=false;
  try
    FileNameStream:=TMemoryStream.Create;
    FileNameStream.LoadFromFile(sourceFile);
    Deststream:=TMemoryStream.Create;
    SourceStream:=TCompressionStream.Create(clMax, DestStream);
    FileNameStream.SaveToStream(SourceStream);
    DestStream.SaveToFile(destFile);
    result:=true;
  finally
    SourceStream.Free;
    FileNameStream.Free;
    Deststream.Free;
  end;
end;function TdataM.unzipFile(sourceFile, destFile: string): boolean;
var
  dataStream,DestStream:TMemoryStream;
  SourceStream: TDeCompressionStream;
  count:integer;
  Buffer:pointer;
begin
  result:=false;
  try
    dataStream:=TMemoryStream.Create;
    DestStream:=TMemoryStream.Create;
    dataStream.LoadFromFile(sourceFile);
    dataStream.Position := 0;
    dataStream.ReadBuffer(Count, Sizeof(Count));
    GetMem(Buffer,Count);
    SourceStream := TDecompressionStream.Create(dataStream);
    SourceStream.ReadBuffer(Buffer^,Count);
    DestStream.WriteBuffer(Buffer^,Count);
    DestStream.Position := 0;
    DestStream.SaveToFile(destFile);
    result:=true;
  finally
    dataStream.Free;
    DestStream.Free;
    SourceStream.Free;
  end;
end;

解决方案 »

  1.   

    uses ZLib;const cBufferSize = $4096;function StreamCompression(mInputStream: TStream; mOutputStream: TStream): Integer;
    var
      I: Integer;
      vBuffer: array[0..cBufferSize]of Char;
    begin
      Result := -1;
      if not (Assigned(mInputStream) and Assigned(mOutputStream)) then Exit;
      with TCompressionStream.Create(clMax, mOutputStream) do try
        for I := 1 to mInputStream.Size div cBufferSize do begin
          mInputStream.Read(vBuffer, cBufferSize);
          Write(vBuffer, cBufferSize);
        end;
        I := mInputStream.Size mod cBufferSize;
        if I > 0 then begin
          mInputStream.Read(vBuffer, I);
          Write(vBuffer, I);
        end;
      finally
        Free;
      end;
    end; { StreamCompression }function StreamDecompression(mInputStream: TStream; mOutputStream: TStream): Integer;
    var
      vBuffer: array[0..cBufferSize]of Char;
      I: Integer;
    begin
      Result := -1;
      if not (Assigned(mInputStream) and Assigned(mOutputStream)) then Exit;
      with TDecompressionStream.Create(mInputStream) do try
        repeat
          I := Read(vBuffer, cBufferSize);
          mOutputStream.Write(vBuffer, I);
        until I = 0;
        Result := mOutputStream.Size;
      finally
        Free;
      end;
    end; { StreamDecompression }function zipFile(sourceFile, destFile: string): boolean;
    var
      vSourceFileStream, vDestFileStream: TFileStream;
    begin
      vSourceFileStream := TFileStream.Create(sourceFile, fmOpenRead);
      vDestFileStream := TFileStream.Create(destFile, fmCreate);
      try
        Result := StreamCompression(vSourceFileStream, vDestFileStream) > 0;
      finally
        vSourceFileStream.Free;
        vDestFileStream.Free;
      end;
    end;function unzipFile(sourceFile, destFile: string): boolean;
    var
      vSourceFileStream, vDestFileStream: TFileStream;
    begin
      vSourceFileStream := TFileStream.Create(sourceFile, fmOpenRead);
      vDestFileStream := TFileStream.Create(destFile, fmCreate);
      try
        Result := StreamDecompression(vSourceFileStream, vDestFileStream) > 0;
      finally
        vSourceFileStream.Free;
        vDestFileStream.Free;
      end;
    end;//Example
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      zipFile('c:\temp\temp.dat', 'c:\temp\temp2.z');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      unzipFile('c:\temp\temp.z', 'c:\temp\temp3.dat');
    end;