两种操作:
第一种
var
  inStream,outStream:TFileStream;
  memStream:TMemoryStream;
  cpStream:TCompressionStream;
  size:Integer;
begin
  inStream:=TFileStream.Create('abc.txt',fmOpenRead);//abc.txt为一存在文件
  outStream:=TFileStream.Create('abc.z',fmCreate);
  memStream:=TMemoryStream.Create;
  cpStream:=TCompressionStream.Create(clNone,memStream);
  try
    cpStream.CopyFrom(inStream,0);
    size:=outStream.CopyFrom(memStream,0); //问题所在
  finally
    FreeAndNil(cpStream);
    FreeAndNil(memStream);
    FreeAndNil(outStream);
    FreeAndNil(inStream);
  end;
end;
第二种
压缩流采用TFileStream作为目标,也就是
  cpStream:=TCompressionStream.Create(clNone,outStream);
  那么两种方法产生的输出文件大小相差很多,给人的感觉就是使用TMemoryStream
的时候数据有所丢失。
  更奇怪的是,就算都用同一种方法,在两个不同的程序里面输出文件大小也不相同,好像有其他代码影响到TCompressionStream的感觉,但由于不知道是何处故障,请问,这种问题应该如何调试并解决?不胜感激!

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2993/2993653.xml?temp=.6728784这有些关于流的操作。自己看看
      

  2.   

    我认真看了一下Zlib.pas,发现这么一段话
    Output data is cached internally, written to the output stream only when the internal output buffer is full, all pending output data is flushed when the stream is destroyed.
    上面出现的问题似乎和TMemoryStream的关系不是很大,而和TCompressionStream的关系很大,似乎就是最后写入内部缓冲的内容没有写入到内存流,然后这几个对象就被释放了?
    继续探索中……
      

  3.   

    已找到问题所在,就是上面那段话的问题,需要在往outStream中写入数据之前释放cpStream,这样内部缓冲里的数据才会完全写入memStream中。
    问题算我自己解决的吗?请问管理员,分该怎么办?