5

我们有文件被分为不同的类别,比如说CatA...... CatD每个类别都有一个相关的文件夹,可由用户配置。例如CatAC:\Path\To\CatACatBC:\Path\To\CatB和去。CatC_CatDC:\Path\To\CatCD

现在我想根据以下规范在 zip 文件中/从 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 可以更准确地计算整体进度,并且我会得到一个不那么跳跃的进度条。ZipUnZip(Selected)ZipUnZip(Selected)

我能够通过(ab)使用TVCLUnzip.FilesList.Objects属性将每个文件类别信息“传输”到一个OnStartZip处理程序中来实现这一点,然后我可以在其中进行操作ZipHeader.directory,但这似乎过于复杂和脆弱,所以我希望有一个更直接的解决方案我只是不明白。有任何想法吗?

4

1 回答 1

0

您可以在一个 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 回答