Místa není nikdy dost a proto může být vhodné aby náš program napsaný v Delphi umožňoval kompresovat uživatelská data.
Základem je se rozhodnout jakým způsobem budeme data pakovat, zda použijeme některý ze standardních formátů (ZIP, RAR, 7z) nebo budeme jen balit proud (stream) dat s případnou naší hlavičkou, v horším případě se pokusíme o vytvoření vlastního formátu (proč?).
Dle mé zkušenosti je výhodné použít kompresi streamu dat např. při ukládání větších dat do databáze a např. ZIP formát (případně s heslem) pro práci s více soubory.
Komprese streamu dat
Delphi od nepaměti obsahuje už v základní instalaci podporu pro práci s kompresními a dekompresními streamy díky Zlib (Jean-loup Gailly a Mark Adler) a to ve verzi 1.2.3 - viz. "Embarcadero\RAD Studio\7.0\source\Win32\rtl\common\ZLib.pas". Výsledkem je celkem kvalitní komprese, která na rozdíl od implementace od MS v .NET nevykazuje problémy s hůře komprimovatelnými soubory (pro .NET hledejte ManagedZLib.dll nebo ZLib.NET).
Pro použití přidejte do uses zlib a pak již můžete používat např. TDecompressionStream nebo TCompressionStream a jejich použití je celkem jasné. Základní je třeba něco takového
1oDeflate := TDecompressionStream.Create(zdrojový stream, třeba soubor);
2try
3 oFileStream.CopyFrom(oDeflate, originální velikost souboru);
4finally
5 oDeflate.Free;
6end;
nebo
1with TCompressionStream.Create(clMax, cílový stream) do
2begin
3 try
4 CopyFrom(zdroj nepř. oFileStream, oFileStream.Size);
5 finally
6 Free;
7 end;
8end;
Komprese souborů
Jsem zastáncem standardních kompresních formátů, takže se jich přidržím. Můžete začít např. příslušnou sekcí na torry.net, nebo zkusit slavnou TurboPower Abbrevia, uvolněnou jako Open Source, což je knihovna podporující PKZIP 4 (tj. ZIP), Microsoft CAB, TAR a gzip, a navíc samorozbalující archívy s podporou Delphi 6 - 2010 (aktuální verze je 3.05, Licence: MPL1.1).
Osobně jsem použití komponenty Abbrevia zvažoval, ale nakonec jsem se rozhodl pro knihovnu od 7z. Sice proti Abbrevii mám navíc DLL, ale zato větší podporu formátů, včetně 7z, 64bit ZIPu, větší rychlosti a velmi přehledného rozhraní.
Např. tento kompresní prográmek bežící v konzole.
1program Project1;
2
3
4
5uses
6 SysUtils,
7 sevenzip;
8
9var
10 iTotal: int64;
11
12
13 function ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; stdcall;
14 begin
15 if not total then
16 write(Format('%6.2f%%'#8#8#8#8#8#8#8, [100*value / iTotal]))
17 else
18 iTotal := value;
19 Result := S_OK;
20 end;
21
22procedure testcreate;
23 var
24 Arch: I7zOutArchive;
25 begin
26
27 Arch := CreateOutArchive(CLSID_CFormatZip);
28
29 Arch.AddFile('c:\test.bin', 'folder\test.bin');
30
31 Arch.AddFiles('c:\devkitpro\devkitPPC', 'folder', '*.*', true);
32
33 SetCompressionLevel(Arch, 5);
34
35 SetCompressionMethod(Arch, mzDeflate);
36
37 Arch.SetProgressCallback(nil, ProgressCallback);
38 Arch.SetPassword('heslo');
39
40 Arch.SaveToFile('c:\test.zip');
41end;
42
43begin
44 try
45 testcreate;
46 except
47 on E: Exception do
48 Writeln(E.ClassName, ': ', E.Message);
49 end;
50end.
Web: Delphi 7zip plugin API
Licence: MPL1.1
Jo a pokud máte tip na nějakou dobrou ZIP komponentu, tak neváhejte a vložte odkaz do komentářů.