不用元件不用DLL進行檔案壓縮與解壓(ZLIB) |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
不需要任何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 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
neoaj23
一般會員 發表:35 回覆:7 積分:8 註冊:2003-09-12 發送簡訊給我 |
引言:我試了一下設定TCompressionLevel為zcMax(壓縮率最高),可是不論怎麼調整壓縮率,壓出來的size還是一樣,我用zlibEx的ZDecompressStr函式,請教一下是否有其他參數要設定,還是設定壓縮率是唬人的...引言: 這是單一檔案之壓縮解壓縮, 其實也可用來當做編碼 此外配合Delphi所提供的TeamSource之source Code可以很容易完成完整的檔案壓縮管理工具可否指點一下在那? 如何使用? ~~~Delphi K.Top討論區站長~~~ |
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 我試了一下設定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 發送簡訊給我 |
请问,在解压缩的函数中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 發送簡訊給我 |
引言: 请问,在解压缩的函数中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.comCOUNT的宣告如下 Count: integer; 他是一個整數變數 sou.ReadBuffer(count,sizeof(count)); --- 此处的Count从何而来? 以上表示 將存在壓縮檔案中的SIZE數值讀出到COUNT變數中 所以COUNT的值當然是從當初CompressFile時寫入壓縮檔案的 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |