続・ZIP で圧縮 / 解凍したい (Delphi 2010 以降)

 以前ご紹介した方法では、自分で圧縮したものを自分で解凍する場合はいいのですが、他のアーカイバで圧縮されたものを解凍しようとするとエラーになる事があります。

 今回は、オープンソースで MPL ライセンスな TurboPower Abbrevia を使ってみます。

 TurboPower Abbrevia はコンポーネントなので本来はインストールして使うのですが、わざわざポトリペタリして使うよりも、関数でラッピングした方が使い勝手がいいと思いますので、以前ご紹介した方法と同じ引数を持つ同名の関数を作ってみました。

unit ZipFiles;

interface

uses
  Windows, SysUtils, IOUtils, AbZipper, AbBase, AbBrowse, AbZBrows, AbUnzper,
  AbArcTyp;

procedure CompressZipFile(const aFileName, aSrcDir: TFileName; const aPassword: string = '');
procedure DecompressZipFile(const aFileName, aDstDir: TFileName; const aPassword: string = '');

implementation

procedure CompressZipFile(const aFileName, aSrcDir: TFileName; const aPassword: string);
var
  dFileName: TFileName;
  Zipper: TAbZipper;
begin
  Zipper := TAbZipper.Create(nil);
  try
    Zipper.TempDirectory := TPath.GetTempPath;
    Zipper.BaseDirectory := aSrcDir;
    Zipper.FileName := aFileName;
    Zipper.Password := aPassword;
    Zipper.AutoSave := False;
    Zipper.DOSMode := False;
    for dFileName in TDirectory.GetFiles(aSrcDir, '*.*', TSearchOption.soAllDirectories) do
      Zipper.AddFiles(dFileName, 0);
    Zipper.Save;
  finally
    Zipper.Free;
  end;
end;

procedure DecompressZipFile(const aFileName, aDstDir: TFileName; const aPassword: string);
var
  UnZipper: TAbUnZipper;
begin
  UnZipper := TAbUnZipper.Create(nil);
  try
    UnZipper.TempDirectory := TPath.GetTempPath;
    UnZipper.BaseDirectory := aDstDir;
    UnZipper.ExtractOptions := [eoCreateDirs, eoRestorePath];
    UnZipper.FileName := aFileName;
    UnZipper.Password := aPassword;
    UnZipper.ExtractFiles('*.*');
  finally
    UnZipper.Free;
  end;
end;

end.

 CompressZipFile() / DecompressZipFile() それぞれに省略可能な 3 番目の引数が追加されています。引数名でお分かりの通り、圧縮/解凍時のパスワードを指定するものです。

Note:

 TAbZipper / TAbUnZipper のプロパティには、プログレスバー (TAdMeter) を指定できます。フォームに貼りつけて使うと進捗状況がプログレスバーに表示されます。この独自のプログレスバーを使うのが嫌な場合には、On~Progress イベントハンドラを記述すれば、任意のゲージやプログレスバーで進捗状況を表示する事ができます。

 TAbZipper を使った圧縮の際には AutoSave プロパティを False にしておかないと、AddFiles した時点で書庫に追加されてしまいます。"AutoSave = True" 場合には、Save メソッドを呼ぶ必要はありません。

 本 Tips はソースコード中で IOUtils を利用しているため Delphi 2010 またはそれ以降用となっていますが、

 このように修正すれば、Delphi 6 等でも動作させる事ができます。

See Also:


 BACK