procedure DecompressFiles(const Filename, DestDirectory : String);
var
  dest,s : String;
  decompr : TDecompressionStream;
  infile, outfile : TFilestream; 
  i,l,c : Integer; 
begin
dest := IncludeTrailingPathDelimiter(DestDirectory);
  infile := TFileStream.Create(Filename,fmOpenRead); 
  try    { number of files }
    infile.Read(c,SizeOf(c));
    for i := 1 to c do 
    begin
      { read filename }
      infile.Read(l,SizeOf(l));
      SetLength(s,l);
      infile.Read(s[1],l);
      { read filesize }
      infile.Read(l,SizeOf(l));
      { decompress the files and store it }
      s := dest+s; //include the path      outfile := TFileStream.Create(s,fmCreate);
      decompr := TDecompressionStream.Create(infile);       try
        outfile.CopyFrom(decompr,l);
        finally
        outfile.Free;
        decompr.Free;
        end;
     end;
  finally
    infile.Free;
  end;end;
备份压缩一个文件夹数据表后,恢复不成功。请问以上代码有什么问题? 还是压缩文件有问题?
恢复时提示有一个文件不能create,以后全部文件都没有恢复。

解决方案 »

  1.   

    解压和压缩方法
    procedure UnCompressStream( var memStream: TMemoryStream );
    var
      SourceStream: TDecompressionStream;
      DestStream: TMemoryStream;
      Buffer: PChar;
      Count: Integer;
    Begin
      memStream.ReadBuffer(Count, SizeOf(Count));
      GetMem(Buffer, Count);
      DestStream := TMemoryStream.Create;
      SourceStream := TDecompressionStream.Create(memStream);  Try
        SourceStream.ReadBuffer(Buffer^, Count);
        DestStream.WriteBuffer(Buffer^, Count);
        DestStream.Position := 0;
        memStream.Clear ;
        memStream.CopyFrom(DestStream, 0) ;
      finally
        FreeMem(Buffer);
        DestStream.Free;
      end;
    end;procedure CompressStream(var memStream: TMemoryStream; const CompressionLevel: TCompressionLevel=clMax);
    var
      SourceStream: TCompressionStream;
      DestStream: TMemoryStream;
      Count: Integer;
    Begin
      Count := memStream.Size;
      DestStream := TMemoryStream.Create;
      SourceStream := TCompressionStream.Create( CompressionLevel, DestStream );
      Try
        memStream.SaveToStream(SourceStream);
       // SourceStream.SaveToStream(SourceStream);
        SourceStream.Free;
        memStream.Clear;
        memStream.WriteBuffer(Count, SizeOf(Count));
        memStream.CopyFrom(DestStream, 0);
        memStream.Position := 0 ;
      finally
        DestStream.Free;
      end;
    end;
      

  2.   

    晕倒,比如一个文件要压缩
    var
      meostream :TMemoryStream;meostream := Tmemorystream.create;
    try
      meostream.loadfromfile(filename);
      CompressStream(meostream);  //使用压缩方法压缩该流
      meostream.savetofile(zipfilename); //存为压缩文件名
    finally
      meostream.free;
    end;解压相反