我们有不同类别的文件,比如CatA..CatD。每个类别都有一个可由用户配置的关联文件夹。例如,CatA去C:\Path\To\CatA,CatB去C:\Path\To\CatB,CatC去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对每个作业的Zip和UnZip(Selected)方法进行多个调用,并使用Pathname属性进行一些黑客操作,从而实现了这一点。但是,我更喜欢one调用,而不是Zip/UnZip(Selected),这样VCLZip就可以更准确地计算总体进度,并且获得一个较少波动的进度条。
我能够通过(Ab)使用TVCLUnzip.FilesList.Objects属性将每个文件类别的一些信息“传输”到一个OnStartZip处理程序中,在那里我可以操作ZipHeader.directory,但是这看起来太复杂了,太脆弱了,所以我希望有一个更简单的解决方案,我就是没看到。有什么想法吗?
发布于 2012-08-01 21:37:04
你可以在一个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文件中的源文件文件夹所需的任何值。
https://stackoverflow.com/questions/11682755
复制相似问题