Result := mStream.Size - vPosition; //增量
一行可能有问题,改为:Result := mStream.Size - vPosition+1; //增量
试试。

解决方案 »

  1.   

    你的代码太长今天没时间看了,明天再帮你看吧,下面是我曾经自己写的一个文件压缩的例子,看看有没有参考价值。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,Zlib,
      StdCtrls;type
      TMyFileStruct=record
         FileName:String[125];
         FileSize:Integer;
      end;
      TForm1 = class(TForm)
        OD: TOpenDialog;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}
         procedure CompressStream(SourceStream,DeskStream:TStream);//压缩
         var
              CompStream:TCompressionStream;
         begin
              DeskStream.Position :=0;
              CompStream:=TCompressionStream.Create(clMax,DeskStream);
              SourceStream.Position :=0;
              CompStream.CopyFrom(SourceStream,SourceStream.Size);
              CompStream.Free;
              DeskStream.Position :=0;
         end;     procedure DeCompressStream(SourceStream, DeskStream: TStream);//解压缩
         const
              SixK=$ffff;
         var
              DeCompStream:TDecompressionStream;
              Data:array[1..SixK] of Char;
              Count:Integer;
         begin
              SourceStream.Position:=0;
              DeCompStream:=TDecompressionStream.Create(SourceStream);
              DeskStream.Position :=0;
              try
              repeat
                   Count:=DeCompStream.Read(Data,SixK);
                   if Count>0 then  DeskStream.Write(Data,Count);
              until Count=0;
              finally
              DeCompStream.Free;
              end;
              DeskStream.Position :=0;
         end;procedure CompressFiles(FileNames:TStrings;DeskStream:TStream);
    var
         FileNum,i,CurrentPos:Integer;
         FS:TMyFileStruct;
         TempStream:TMemoryStream;
         FileStream:TFileStream;
    begin
         TempStream:=TMemoryStream.Create;
         FileNum:=FileNames.Count;
         DeskStream.WriteBuffer(FileNum,SizeOf(FileNum));
         CurrentPos:=FileNum*SizeOf(TMyFileStruct)+SizeOf(FileNum);
         for i:=0 to FileNum-1 do
         begin
              FS.FileName:=ExtractFileName(FileNames[i]);
              TempStream.Clear;
              FileStream:=TFileStream.Create(FileNames[i],fmShareDenyRead);
              CompressStream(FileStream,TempStream);
              DeskStream.Position:=i*SizeOf(FS)+SizeOf(FileNum);
              FS.FileSize:=TempStream.Size;
              DeskStream.WriteBuffer(FS,SizeOf(FS));
              DeskStream.Position:=CurrentPos;
              CurrentPos:=CurrentPos+DeskStream.CopyFrom(TempStream,0);
              FileStream.Free;
         end;
         TempStream.Free;
    end;
    procedure DeCompressFiles(DirStr:String;DeskStream:TStream);
    var
         FileNum,i,CurrentPos:Integer;
         FS:TMyFileStruct;
         SourceStream,TempStream:TMemoryStream;
    begin
         TempStream:=TMemoryStream.Create;
         SourceStream:=TMemoryStream.Create;
         DeskStream.ReadBuffer(FileNum,SizeOf(FileNum));
         CurrentPos:=FileNum*SizeOf(FS)+SizeOf(FileNum);
         for i:=0 to FileNum-1  do
         begin
              DeskStream.Position:=i*SizeOf(FS)+SizeOf(FileNum);
              DeskStream.ReadBuffer(FS,SizeOf(FS));
              SourceStream.Clear;
              DeskStream.Position :=CurrentPos;
              CurrentPos:=CurrentPos+SourceStream.CopyFrom(DeskStream,FS.FileSize);
              TempStream.Clear;
              DeCompressStream(SourceStream,TempStream);
              TempStream.SaveToFile(DirStr+FS.FileName);
         end;
         SourceStream.Free;
         TempStream.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
         f:TMemoryStream;
    begin
         f:=TMemoryStream.Create;
         if OD.Execute then
         begin
              CompressFiles(OD.Files,f);
         end;
         f.Position:=0;
         DeCompressFiles('d:\',f);//测试
    end;end.
      

  2.   

    我建了一个用来delphi讨论的群,群号是5245338,欢迎大家加入,共同研究讨论!
      

  3.   

    zlib有时候解压缩会有问题,我就碰到了。