2012-07-27 12 views
5

Wir haben Dateien, die in verschiedene Kategorien gruppiert sind, sagen CatA .. CatD. Jede Kategorie hat einen zugeordneten Ordner, der vom Benutzer konfiguriert werden kann. Zum Beispiel geht CatA zu C:\Path\To\CatA, CatB zu C:\Path\To\CatB und CatC und CatD gehen zu C:\Path\To\CatCD.VCLZip: "Virtuelle" Verzeichnisse in Zip-Datei

Jetzt möchte ich zum Sichern und Wiederherstellen dieser Dateien in/aus einer ZIP-Datei nach einer Spezifikation wie

[CatA] 
SomeFile.abc 
*.txt 

[CatB] 
File3.xyz 
File4.xyz 
. 
. 
. 

Die resultierende ZIP-Datei eine Struktur wie

diese
CatA 
    SomeFile.abc 
    aaa.txt 
    bbb.txt 
    ccc.txt 
CatB 
    File3.xyz 
    File4.xyz 
. 
. 
. 

ich es geschafft haben sollte, mit VCLZip durch mehrere Aufrufe an die Zip und UnZip(Selected) Methoden pro Job und ein bisschen Hacker mit der Pathname-Eigenschaft. Allerdings würde ich einen Anruf zu Zip/UnZip(Selected) bevorzugen, so dass VCLZip den gesamten Fortschritt genauer berechnen kann und ich einen weniger jumpy Fortschrittsbalken bekomme.

Ich konnte dies umzusetzen, indem (ab) die TVCLUnzip.FilesList.Objects Eigenschaften mit einigen pro Datei Kategorie info in einen OnStartZip Handler „Transfer“ wo kann ich dann ZipHeader.directory manipulieren, aber dies scheint viel zu kompliziert und zerbrechlich, so hoffe ich, Es gibt eine einfachere Lösung, die ich einfach nicht sehe. Irgendwelche Ideen?

+0

Die Online-Hilfe für 'OnStartZip' hat ein Beispiel, das die Pfade im letzten Moment ändert, und erwähnt, welche anderen Eigenschaften sicher geändert werden können. Die einzige Sache, die für Sie etwas komplizierter ist, ist, die richtigen Informationen basierend auf dem übergebenen Dateinamen zurück zu bekommen, und Sie haben es bereits geschafft, das zu lösen. Ich würde es so halten. – hvd

Antwort

0

Sie können es in einem ZIP-Aufruf tun. Füllen Sie einfach TVCLZip.FileList und 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'); 
...... 

Und TVCLZip.OnStartZip definieren. Ich habe diese Strategie in meinem Projekt verwendet und es funktioniert gut. Zum Beispiel:

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; 

können Sie legen ZipHeader.directory auf einen beliebigen Wert Sie benötigen Quelldateiordner in einer ZIP-Datei sein.

Verwandte Themen