2012-07-27 17 views
5

CatACatDのような異なるカテゴリにグループ化されたファイルがあります。すべてのカテゴリには、ユーザーが設定できる関連フォルダがあります。例えば、CatAは、C:\Path\To\CatA,CatB~C:\Path\To\CatBおよびCatCおよびCatDC:\Path\To\CatCDになります。VCLZip: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 
. 
. 
. 

のような構造を持つべきでは/ zipファイルからこれらのファイルを復元とし、ジョブごとにZipUnZip(Selected)のメソッドを呼び出し、Pathnameプロパティを使用してHackeryを呼び出すことでVCLZipを使用します。しかし、Zip/UnZip(Selected)に呼び出すと、VCLZipはより正確な全体的な進捗状況を計算でき、私はあまり跳躍しないプログレスバーを得ることができます。

私はその後、ZipHeader.directoryを操作することができOnStartZipハンドラへの「移転」いくつかのファイルごとにカテゴリ情報をにTVCLUnzip.FilesList.Objectsプロパティを使用して(AB)でこれを実装することができましたが、これはあまりにも複雑で壊れやすいと思われるので、私は願っています私が見ていないより簡単な解決策があります。何か案は?

+0

'OnStartZip'のオンラインヘルプには、最後のパスを変更する例があり、他のどのプロパティを変更しても安全だと言及しています。もう少し複雑なのは、渡されたファイル名に基づいて適切な情報を取り戻すことだけです。あなたはすでにそれを解決することができました。私はそのように保つだろう。 – hvd

答えて

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ファイルのソースファイルフォルダに必要な値を設定できます。

関連する問題