如何使用 ZLib 單位進行壓縮資料

有關Delphi 的語法, 程式, 等
回覆文章
頭像
tim
文章: 1380
註冊時間: 2008年 11月 26日, 00:49

如何使用 ZLib 單位進行壓縮資料

文章 tim »

使用 ZLib 單位進行壓縮資料

請參考部分原始碼, 附件檔為完整程式 sample.

使用 zlib unit 後, 即可使用 TCompressionStream 及 TDecompressionStream, 壓縮使用 TCompressionStream, 在建立 TCompressionStream 要傳入壓縮方式及借用的 TStream, 該 TStream 的目的即為壓縮的資料, TCompressionStream 可以使用 Write 方法將資料傳入, 該 TCompressionStream 即會進行壓縮, 完成一個 buffer size 時, 就會寫入 TStream, 或是在該 TCompressionStream free 時, 也會將未滿 buffer 的資料 flush 全部寫入 TStream 中.

TDecompressionStrem 則是於 Create 時就要傳入一個 TStream 作為傳入已壓縮的資料用的來源. 再利用 Read 方法來進行解壓縮資料, 利用一個自己建立的 buffer 來進行部分解壓的讀出, 隨著 Read 方法的讀出資料, TDecompressionStream 也會傳回實際解出的資料量, 若無資料要再解壓縮時, 就傳回 0 , 即為結束.

代碼: 選擇全部

     
    const 
      MaxBuf = 1024; 
     
    procedure Tform1.Button1Click(Sender: TObject); 
    var 
      cs: TCompressionStream; 
      fsi, fso: TMemoryStream; 
    begin 
      if OpenDialog1.Execute then 
      begin 
        if SaveDialog1.Execute then 
        begin 
          fsi:= TMemoryStream.Create; 
          fso:= TMemoryStream.Create; 
          fsi.LoadFromFile(OpenDialog1.FileName); 
          PrintLog('compress file: '+OpenDialog1.FileName+'('+IntToStr(fsi.Size)+')'); 
          fsi.Position := 0; 
          cs:= TCompressionStream.Create(clDefault, fso); 
          cs.Write(PByte(fsi.Memory)^, fsi.Size); 
          cs.Free; 
          fso.SaveToFile(SaveDialog1.FileName); 
          PrintLog('compressed file: '+SaveDialog1.FileName+'('+IntToStr(fso.Size)+')'); 
          fsi.Free; 
          fso.Free; 
        end; 
      end; 
    end; 
     
     
     
    procedure Tform1.Button2Click(Sender: TObject); 
    var 
      ds: TDecompressionStream; 
      fsi, fso: TMemoryStream; 
      buf: Array[0..MaxBuf -1] of Byte; 
      ibyteProcessed: Integer; 
    begin 
      if OpenDialog1.Execute then 
      begin 
        if SaveDialog1.Execute then 
        begin 
          fsi:= TMemoryStream.Create; 
          fso:= TMemoryStream.Create; 
          fsi.LoadFromFile(OpenDialog1.FileName); 
          fsi.Position := 0; 
          PrintLog('Decompress file: '+OpenDialog1.FileName+'('+IntToStr(fsi.Size)+')'); 
          ds:= TDecompressionStream.Create(fsi); 
          repeat 
            ibyteProcessed := ds.Read(buf, MaxBuf); 
            if ibyteProcessed > 0 then 
              fso.Write(buf, ibyteProcessed); 
          until ibyteProcessed = 0;    
          ds.Free; 
          fso.SaveToFile(SaveDialog1.FileName); 
          PrintLog('Decompressed file: '+SaveDialog1.FileName+'('+IntToStr(fso.Size)+')'); 
          fsi.Free; 
          fso.Free; 
        end; 
      end; 
     
    end; 
附加檔案
4_132.zip
(2.27 KiB) 已下載 375 次
多多留言, 整理文章, 把經驗累積下來.....
回覆文章