全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4708
推到 Plurk!
推到 Facebook!

不用元件不用DLL進行檔案壓縮與解壓(ZLIB)

 
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-26 20:19:18 IP:210.202.xxx.xxx 未訂閱
不需要任何VCL元件,也不需任何DLL檔, 採用zlib來做檔案的壓縮與解壓! 感謝ccchen提供相關資料!    使用此兩個函數之前要uses zlib
uses zlib;
// 將SrcFile壓縮並存檔為DestFile
function CompressFile(const SrcFile,DestFile:String):Boolean;
const Level: TCompressionLevel=clDefault;
var
  des:TMemoryStream;
  sou:TMemoryStream;
  cs: TCompressionStream;
  Count: Integer;
  ret:boolean;
begin
  ret:=false;
  des:=TMemoryStream.Create;
  sou:= TMemoryStream.Create;
  cs:=TCompressionStream.Create(level,des);
  try
    sou.LoadFromFile(SrcFile);
    Count:=sou.Size;
    sou.SaveToStream(cs);
    cs.Free;        sou.Clear;
    sou.WriteBuffer(Count, SizeOf(Count));
    sou.CopyFrom(des,0);        des.Clear;        des.Seek(0,soFromBeginning);
    des.CopyFrom(sou,0);
    des.SaveToFile(DestFile);
    ret:=true;
  finally
    des.Free;
    sou.Free;
    result:=ret;
  end;
end;
// 將SrcFile壓縮檔壓縮並存檔為DestFile
function DeCompressFile(const SrcFile,DestFile:String):boolean;
var
  des:TFileStream;
  sou:TMemoryStream;
  decs: TDeCompressionStream;
  Buffer: PChar;
  Count: integer;
  ret:boolean;
begin
  Buffer:=nil;
  ret:=false;
  des:=TFileStream.Create(DestFile,fmCreate);
  sou:= TMemoryStream.Create;
  decs:=nil;
  try
    sou.LoadFromFile(SrcFile);
    sou.Seek(0,soFromBeginning);
    sou.ReadBuffer(count,sizeof(count));
    GetMem(Buffer, Count);
    decs:=TDeCompressionStream.Create(sou);
    decs.ReadBuffer(Buffer^, Count);
    Des.WriteBuffer(Buffer^, Count);
    Des.Position := 0;
    ret:=true;
  finally
    FreeMem(Buffer);
    decs.Free;
    des.Free;
    sou.Free;
    result:=ret;
  end;
end;
~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-26 20:37:19 IP:203.217.xxx.xxx 未訂閱
這是單一檔案之壓縮解壓縮, 其實也可用來當做編碼 此外配合Delphi所提供的TeamSource之source Code可以很容易完成完整的檔案壓縮管理工具
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-27 21:21:03 IP:192.168.xxx.xxx 未訂閱
引言: 這是單一檔案之壓縮解壓縮, 其實也可用來當做編碼 此外配合Delphi所提供的TeamSource之source Code可以很容易完成完整的檔案壓縮管理工具
可否指點一下在那? 如何使用? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-28 15:12:59 IP:61.219.xxx.xxx 未訂閱
TeamSource 在delphi安裝時並不會自動安裝, 必須另外安裝 主要用Zlib壓縮管理Delphi之source code, 同時包含版本管理比對等. 由於希望在自己程式中有些檔案壓縮管理工具,又不希望受限於使用3rd Party元件導至程式不能賣, 因此可參考TeamSource 之souce Code發展獨立之工具
neoaj23
一般會員


發表:35
回覆:7
積分:8
註冊:2003-09-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-20 15:38:24 IP:61.219.xxx.xxx 未訂閱
引言:
引言: 這是單一檔案之壓縮解壓縮, 其實也可用來當做編碼 此外配合Delphi所提供的TeamSource之source Code可以很容易完成完整的檔案壓縮管理工具
可否指點一下在那? 如何使用? ~~~Delphi K.Top討論區站長~~~
我試了一下設定TCompressionLevel為zcMax(壓縮率最高),可是不論怎麼調整壓縮率,壓出來的size還是一樣,我用zlibEx的ZDecompressStr函式,請教一下是否有其他參數要設定,還是設定壓縮率是唬人的...
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-22 12:09:46 IP:192.168.xxx.xxx 未訂閱
引言: 我試了一下設定TCompressionLevel為zcMax(壓縮率最高),可是不論怎麼調整壓縮率,壓出來的size還是一樣,我用zlibEx的ZDecompressStr函式,請教一下是否有其他參數要設定,還是設定壓縮率是唬人的...
Zlib是windows系統提供的內附壓縮程式庫, 我想應該是個簡易的壓縮程式庫, 一般所謂壓縮率實際指的應該是壓縮的方法, 不同的壓縮方法 壓縮率自然就不同 解壓所需的時間也就不同 假設ZLib所支援的壓縮方法本來就不多的情況下 您給的壓縮資料源檔 可能經過ZLib分析後 不管指定多少壓縮率所用的壓縮法都一樣的話 自然壓完的Size就不變了 您可以試著給不同型式的檔案(如文字檔或.BMP,這種可達到高壓縮的檔案) 再試著指定不同壓縮率看有沒有變化 若還是不行 只能說ZLib太弱了 至於是否唬人就不得而知了 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
yzyangliu
一般會員


發表:0
回覆:1
積分:0
註冊:2005-07-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-10 09:37:45 IP:221.229.xxx.xxx 未訂閱
请问,在解压缩的函数中Count从何而来? function DeCompressFile(const SrcFile,DestFile:String):boolean; var des:TFileStream; sou:TMemoryStream; decs: TDeCompressionStream; Buffer: PChar; Count: integer; ret:boolean; begin Buffer:=nil; ret:=false; des:=TFileStream.Create(DestFile,fmCreate); sou:= TMemoryStream.Create; decs:=nil; try sou.LoadFromFile(SrcFile); sou.Seek(0,soFromBeginning); sou.ReadBuffer(count,sizeof(count)); --- 此处的Count从何而来? GetMem(Buffer, Count); decs:=TDeCompressionStream.Create(sou); decs.ReadBuffer(Buffer^, Count); Des.WriteBuffer(Buffer^, Count); Des.Position := 0; ret:=true; finally FreeMem(Buffer); decs.Free; des.Free; sou.Free; result:=ret; end; end; 我的邮箱是: yzyangliu@sina.com
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-20 21:59:02 IP:220.134.xxx.xxx 未訂閱
引言: 请问,在解压缩的函数中Count从何而来? function DeCompressFile(const SrcFile,DestFile:String):boolean; var des:TFileStream; sou:TMemoryStream; decs: TDeCompressionStream; Buffer: PChar; Count: integer; ret:boolean; begin Buffer:=nil; ret:=false; des:=TFileStream.Create(DestFile,fmCreate); sou:= TMemoryStream.Create; decs:=nil; try sou.LoadFromFile(SrcFile); sou.Seek(0,soFromBeginning); sou.ReadBuffer(count,sizeof(count)); --- 此处的Count从何而来? GetMem(Buffer, Count); decs:=TDeCompressionStream.Create(sou); decs.ReadBuffer(Buffer^, Count); Des.WriteBuffer(Buffer^, Count); Des.Position := 0; ret:=true; finally FreeMem(Buffer); decs.Free; des.Free; sou.Free; result:=ret; end; end; 我的邮箱是: yzyangliu@sina.com
COUNT的宣告如下 Count: integer; 他是一個整數變數 sou.ReadBuffer(count,sizeof(count)); --- 此处的Count从何而来? 以上表示 將存在壓縮檔案中的SIZE數值讀出到COUNT變數中 所以COUNT的值當然是從當初CompressFile時寫入壓縮檔案的 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
系統時間:2024-05-05 23:54:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!