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

5
我们有不同分类的文件,例如CatA..CatD。每个分类都有一个关联的文件夹,可以由用户进行配置。例如,CatA对应到C:\Path\To\CatA,CatB对应到C:\Path\To\CatB,而CatC和CatD对应到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
.
.
.

我使用VCLZip通过对Pathname属性的一些hack操作,以及在每个作业中多次调用Zip和UnZip(Selected)方法来实现这一点。然而,我更喜欢使用一次调用Zip/UnZip(Selected)方法,这样VCLZip可以更准确地计算总体进度,从而得到更平滑的进度条。
我能够实现这个目标是通过在OnStartZip处理程序中滥用TVCLUnzip.FilesList.Objects属性将一些每个文件类别的信息“传输”到ZipHeader.directory中,但这似乎过于复杂和脆弱,所以我希望有一个更直接的解决方案,但我自己并没有想出来。你有什么想法吗?

OnStartZip 的在线帮助中有一个示例,它在最后一刻更改路径,并提到了哪些其他属性是安全更改的。对于您来说唯一有点复杂的是根据传递的文件名获取正确的信息,而您已经成功解决了这个问题。我建议您保持现状。 - user743382
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文件中作为源文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接