procedure TForm1.Button1Click(Sender: TObject);
var
jy:TdeCompressionStream;
target:tmemorystream;
fstream:tfilestream;
buf:array [1..512] of byte;
i:int64;
begin
target:=tmemorystream.Create;
fstream:=tfilestream.Create(ExtractFilePath(ParamStr(0))+'file\aa.ash',fmopenread);
jy:=TdeCompressionStream.Create(fstream);
jy.Position:=0;
target.Seek(0,sofromend) ;
try
begin
repeat
begin
i:=jy.Read(buf,512);
if i>0 then
target.Write(buf,512);
end;
until i=0;
target.Position:=0;
target.SaveToFile(ExtractFilePath(ParamStr(0))+'file\aa.doc');
end;
finally
begin
jy.Free;
fstream.Free;
end;
end;
end;
以上是代码,很简单,就是把一个压缩好的文件解压,但i:=jy.Read(buf,512);这里老是出错,请问是为什么?错误提示就是“eorro”,什么都没有了

解决方案 »

  1.   

    应该是ZLib单元的问题,或许是ZLib不支持你解压的文件
      

  2.   

    那个压缩文件是我自己用zlib压缩的,另外就算不支持,总也该出现个结果吧,虽然不一定对
      

  3.   

    选择调试DCU,然后跟踪调试到jy.Read函数中CCheck函数调用出的错误
      

  4.   

    给你两个完整的函数用吧
    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;
      

  5.   

    我用的是盗版的,好像没有DCU调试器~~~~~~~~~~~~~
      

  6.   

    Project->Options->Compiler->Use Debug DCUs选中
      

  7.   

    DCU那项是灰的,不让选,大侠帮我看看吧,我实在不知道什么地方出错误了,谢谢,谢谢啦,在下感激涕零啊~~~~~~~~~5555555555
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleCtrls, SHDocVw, ExtDlgs, ExtCtrls, Buttons, shellapi,zlib,
      jpeg;type
      TForm1 = class(TForm)
        OpenDialog1: TOpenDialog;
        Image1: TImage;
        BitBtn3: TBitBtn;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        BitBtn1: TBitBtn;
        Button1: TButton;
        Edit4: TEdit;
        procedure BitBtn3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      count:int64;
    implementation{$R *.dfm}procedure TForm1.BitBtn3Click(Sender: TObject);
    var
    fname:string;//文件全名
    fextract:string;//文件扩展名
    fstream:tfilestream;
    target,outstream:tmemorystream;
    ys:TCompressionStream;
    begin
    if opendialog1.Execute then
    begin
    edit1.Text:=opendialog1.FileName;
    fextract:=ExtractFileExt(opendialog1.FileName);
    fname:=copy(ExtractFileName(opendialog1.FileName),0,length(ExtractFileName(opendialog1.FileName))-4);
    fstream:=tfilestream.Create(opendialog1.FileName,fmOpenRead or fmShareExclusive);
    count:=fstream.Size;
    target:=tmemorystream.Create;
    target.Seek(0,sofromend);
    target.CopyFrom(fstream,fstream.Size);//转到内存流
    fstream.Free;
    target.Seek(SoFromBeginning,0);
    outstream:=tmemorystream.Create;
    outstream.Size:=target.Size;
    ys:=TCompressionStream.Create(clfastest,outstream);
    ys.copyfrom(target,target.size);
    outstream.Position:=0;
    outstream.SaveToFile(ExtractFilePath(ParamStr(0))+'file\'+fname+'.ash');
    target.Free;
    ys.Free;
    outstream.Free;
    end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    if directoryexists(ExtractFilePath(ParamStr(0))+'file')=false then   //判断文件夹是否存在
    CreateDirectory(pchar(ExtractFilePath(ParamStr(0))+'file'),nil);     //创建文件夹
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    jy:TdeCompressionStream;
    target:tmemorystream;
    fstream:tfilestream;
    buf:pchar;
    begin
    target:=tmemorystream.Create;
    fstream:=tfilestream.Create(ExtractFilePath(ParamStr(0))+'file\点表.ash',fmopenread);
    jy:=TdeCompressionStream.Create(fstream);
    jy.Position:=0;
    target.Clear;
    target.Position:=0;
    getmem(buf,count);
    try
    begin
    jy.ReadBuffer(buf^,count);
    target.WriteBuffer(buf^,count);
    target.Position:=0;
    target.SaveToFile(ExtractFilePath(ParamStr(0))+'file\aa.doc');
    end;
    finally
    begin
    freemem(buf);
    jy.Free;
    fstream.Free;
    target.Free;
    end;
    end;
    end;end.
      

  8.   

    TCompressionStream
    和TdeCompressionStream
    是对应 的 不支持拆分解压
      

  9.   

    安照dabaicai(不再做菜鸟) 的做法我也做了,但还是有错,原因是文件大了,不能一次读写,我以前测试过,一次读写的上限大概是14000多个字节,我的文件现在是132K,已经超了,如果用copyfrom可以一次读写出来,但解压流不能用这个方法,我不知道是为什么,老是出错,DCU调试器又不能用,急死了