VCLZip:zip文件中的"虚拟"目录

Uli*_*rdt 5 delphi zip unzip delphi-2007 vclzip

我们有被分成不同类别的文件,说CatA... CatD.每个类别都有一个可由用户配置的关联文件夹.例如CatAC:\Path\To\CatA,CatBC:\Path\To\CatBCatCCatDC:\Path\To\CatCD.

现在我想根据类似的规范在zip文件中备份和恢复这些文件

[CatA]
SomeFile.abc
*.txt

[CatB]
File3.xyz
File4.xyz
.
.
.
Run Code Online (Sandbox Code Playgroud)

生成的zip文件应该具有类似的结构

CatA
  SomeFile.abc
  aaa.txt
  bbb.txt
  ccc.txt
CatB
  File3.xyz
  File4.xyz
.
.
.
Run Code Online (Sandbox Code Playgroud)

我通过与VCLZip管理这个的电话ZipUnZip(Selected)每工作方法有点两轮牛车与路径名属性.但是我更喜欢一次调用Zip/ UnZip(Selected)以便VCLZip可以更准确地计算整体进度,并且我得到一个不那么紧张的进度条.

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

val*_*lex 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');
......
Run Code Online (Sandbox Code Playgroud)

并定义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;
Run Code Online (Sandbox Code Playgroud)

您可以将 ZipHeader.directory 设置为 ZIP 文件中源文件夹所需的任何值。