5

..など、さまざまなカテゴリにグループ化されたファイルがありCatAますCatD。すべてのカテゴリには、ユーザーが構成できる関連付けられたフォルダーがあります。たとえば、 go CatAto C:\Path\To\CatACatBto C:\Path\To\CatBCatCおよびCatDgo toC:\Path\To\CatCDです。

今、これらのファイルを次のような仕様に従ってzipファイルに/からバックアップおよび復元したい

[CatA]
SomeFile.abc
*.txt

[CatB]
File3.xyz
File4.xyz
.
.
.

結果のzipファイルは、次のような構造を持つ必要があります

CatA
  SomeFile.abc
  aaa.txt
  bbb.txt
  ccc.txt
CatB
  File3.xyz
  File4.xyz
.
.
.

VCLZip を使用して、ジョブごとにおよびメソッドを複数回呼び出し、 Pathname プロパティを少しハックすることで、これを管理しました。ただし、VCLZip が全体的な進行状況をより正確に計算できるように/を1 回呼び出すことをお勧めします。ZipUnZip(Selected)ZipUnZip(Selected)

プロパティを(ab) 使用して、TVCLUnzip.FilesList.Objectsファイルごとのカテゴリ情報をOnStartZipハンドラーに "転送" することでこれを実装することができましZipHeader.directoryたが、これは複雑すぎて壊れやすいようです。私はちょうど見えません。何か案は?

4

1 に答える 1

0

1 回の ZIP 呼び出しで実行できます。TVCLZip.FileList と TVclZIP.ExcludeList に入力するだけです

VCLZip.FileList.Add('C:\Path\To\CatA\*.txt');
VCLZip.FileList.Add('C:\Path\To\CatA\SomeFile.abc');
VCLZip.FileList.Add('C:\Path\To\CatB\File3.xyz');
......

と定義しますTVCLZip.OnStartZip。私は自分のプロジェクトでこの戦略を使用しましたが、うまく機能します。例えば:

procedure TMainForm.VCLZipStartZip( Sender: TObject; FName: String;  var ZipHeader: TZipHeaderInfo; var Skip: Boolean );
var Dest: String;

begin
try
   Dest:=ExtractFilePath(FName);
   Dest:=StringReplace(Dest,'C:\Path\To\','' ,[rfReplaceAll,rfIgnoreCase]);
   ZipHeader.directory:=Dest;
end;

ZipHeader.directory は、ZIP ファイルのソース ファイル フォルダーにするために必要な任意の値に設定できます。

于 2012-08-01T21:37:04.853 に答える