我们将文件分为不同的类别,例如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
.
.
.
我通过对每个作业进行多次调用Zip
和UnZip(Selected)
方法以及使用Pathname属性进行一些hackery来对VCLZip进行管理。不过我更喜欢一次调用Zip
/ UnZip(Selected)
,这样VCLZip可以更准确地计算整体进度,而且我的进度条不那么突出。
我能够通过(ab)使用TVCLUnzip.FilesList.Objects
属性来实现这一点,将每个文件类别信息“转移”到OnStartZip
处理程序中,然后我可以操作ZipHeader.directory
,但是这似乎太复杂和脆弱,所以我希望有一个更直接的解决方案,我只是没有看到。有什么想法吗?
答案 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文件中需要作为源文件文件夹的任何值。