做一个将word文件存入sql数据库的程序,由于不采用压缩,直接存储流,容量太大,于是选择先将流压缩存储,然后再解压流重新生成word提供给用户打开。
用zlib中的TCompressionStream和TDeCompressionStream两个类。
压缩存储的过程没有问题,但是解压缩就出现问题了
procedure DeCompression_Stream(Ainstream,AoutStream: TStream);
var
  lDeCompressionStream: TDeCompressionStream;
  buf: array[1..512] of byte;
  sread: integer;
begin
  lDeCompressionStream:=nil;
  lDeCompressionStream:=TDeCompressionStream.Create(AinStream);
  try
    repeat
      //读入实际大小
      sRead := lDeCompressionStream.Read(buf, sizeof(buf));
      if sread > 0 then
        AOutStream.Write(buf, sRead);
    until (sRead = 0);
  finally
    lDeCompressionStream.Free;
  end;  
end;
这是代码,在sRead := lDeCompressionStream.Read(buf, sizeof(buf));处报错“error”
请求各位高手看看

解决方案 »

  1.   


    unit Unit1; interface uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, DB, ADODB, StdCtrls, shellapi,Buttons, OleCtnrs; 
    type 
    TForm1 = class(TForm) 
    ADOConnection1: TADOConnection; 
    Button1: TButton; 
    Button2: TButton; 
    OpenDialog1: TOpenDialog; 
    ADOQuery1: TADOQuery; 
    OleContainer1: TOleContainer; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; var 
    Form1: TForm1; 
    s:string; 
    implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    if OpenDialog1.Execute then 
    begin 
    if not ADOQuery1.Active then ADOQuery1.Open; 
    ADOQuery1.Append; 
    s :=ExtractFileName(OpenDialog1.FileName); 
    (ADOQuery1.FieldByName('doc') as TBlobField).LoadFromFile(OpenDialog1.filename); 
    ADOQuery1.Post; end; 
    end; 
    procedure TForm1.Button2Click(Sender: TObject); 
    begin 
    (ADOQuery1.FieldByName('doc') as TBlobField).savetoFile(ExtractFileDir(Application.ExeName)+'\'+s); // (ADOQuery1.FieldByName('doc') as TBlobField).savetoFile('你要的路径' +s) ; 
    shellexecute(handle,nil,pchar(s),nil,nil,sw_shownormal); 
    end; end.