VCLZip:zip文件中的“虚拟”目录

时间:2012-07-27 06:46:31

标签: delphi zip delphi-2007 unzip vclzip

我们将文件分为不同的类别,例如CatA .. CatD。每个类别都有一个可由用户配置的关联文件夹。例如,CatA转到C:\Path\To\CatACatB转到C:\Path\To\CatBCatCCatD转到C:\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
.
.
.

我通过对每个作业进行多次调用ZipUnZip(Selected)方法以及使用Pathname属性进行一些hackery来对VCLZip进行管理。不过我更喜欢一次调用Zip / UnZip(Selected),这样VCLZip可以更准确地计算整体进度,而且我的进度条不那么突出。

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

1 个答案:

答案 0 :(得分: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文件中需要作为源文件文件夹的任何值。