请问为什么数据流压缩后savetofile 成.txt文件,和用数据集load压缩后的数据集,再savetofile成.txt文件,两者不相同,有何解决办法。问题解决马上结帖。

解决方案 »

  1.   

    问题:把数据流保存到某个TXT文本中,在用ClientDataSet控件Load进来,然后在用ClientDataSet保存到另一个TXT文本中,两个TXT的大小不一样。
    procedure Tfrm_detail_contract.compressFile(dataset :Tclientdataset);
    var
    CompressLevel: TCompressionLevel;
    SourceFileStream: TFileStream;CompressStream: TCompressionStream;
    MemStream,DestMemStream: TMemoryStream;
    NewStream :TMemoryStream ;
    Buffer: PChar;
    Count,MemSize: Longint;
    begin
    CompressLevel:= clDefault;
    try
    dataset.SaveToFile('d:\raw1.txt',dfbinary);
    SourceFileStream := TFileStream.Create('d:\raw1.txt', fmOpenRead); //打开源文件
    Count := SourceFileStream.size; //读出源文件大小
    GetMem(Buffer, Count);
    MemStream := TMemoryStream.Create;
    NewStream := TMemoryStream.Create;
    DestMemStream := TMemoryStream.Create;
    CompressStream := TCompressionStream.Create(CompressLevel, DestMemStream);
    try
    SourceFileStream.ReadBuffer(Buffer^, Count); //将源文件内容读到Buffer中
    MemStream.WriteBuffer(Buffer^, Count); //将Buffer内容读到MemStream中
    MemSize := MemStream.Size; //记录原始文件尺寸
    MemStream.SaveToStream(CompressStream); //将MemStream内容压缩保存在DestMemStream中
    CompressStream.Free;
    MemStream.Clear; //清空MemStream内容
    MemStream.WriteBuffer(MemSize, SizeOf(MemSize)); //写入原始文件尺寸
    MemStream.CopyFrom(DestMemStream, 0 ); //将压缩过的文件流DestMemStream内容拷贝到MemStream中
    // MemStream.Seek(0,0);
    *********************************************************************
    MemStream.SaveToFile('d:\compressed.txt'); //保存为compressed.txt文件
    frm_C_DM.TmpCDSCmpress.LoadFromStream(MemStream);
    frm_C_DM.TmpCDSCmpress.SaveToFile('d:\compressed1.txt') ;//保存为compressed1.txt文件
    //compressed.txt 和文件compressed1.txt 大小不相等
    **********************************************************************
    showmessage('successful!')//result := true;
    finally
    FreeMem(Buffer);
    MemStream.Free; DestMemStream.Free; SourceFileStream.Free;
    end;
    except
    showmessage('failed!')
    //result := false;
    end; 
      

  2.   

    txt的内容一样吗?有时文件占用的磁盘空间会有出入的
      

  3.   

    看不出来有什么错误,
    除非frm_C_DM.TmpCDSCmpress这个东西,
    frm_C_DM.TmpCDSCmpress是什么对象?
      

  4.   

    内容是不一样的,可能是因为这样才导致两个文件的大小 不相同,也使得数据集load的stream和tmemortstream  load的stream不等价。
      

  5.   

    to JavaD(一竿残照):TClientDataset ( 代码是直接copy的,)
      

  6.   

    cds的LoadFormStream是需要特殊格式的,你自定义的一个压缩格式当然不行,
    你不能将cds的LoadFromStream和TStream及其派生类的LoadFromStream方法混淆
      

  7.   

    to JavaD(一竿残照):
    你是说格式不对,那,有什么办法能让保存到内存流的东西,放到数据集中呢,谢谢