2012-07-27 12 views
5

Mamy pliki pogrupowane w różne kategorie, na przykład CatA .. CatD. Każda kategoria ma powiązany folder, który może być skonfigurowany przez użytkownika. Na przykład CatA przechodzi do C:\Path\To\CatA, CatB do C:\Path\To\CatB i CatC i CatD przejdź do C:\Path\To\CatCD.VCLZip: "Wirtualne" katalogi w pliku zip

Teraz chcę do tworzenia kopii zapasowych i przywracania tych plików w/z pliku zip według specyfikacji jak

[CatA] 
SomeFile.abc 
*.txt 

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

Powstały plik zip powinien mieć strukturę jak

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

udało to ja z VCLZip poprzez wywoływanie wielu połączeń z metodami na zadanie i trochę hackery z właściwością Pathname. Jednak wolałbym jedno połączenie do Zip/UnZip(Selected), aby VCLZip mógł dokładniej obliczyć ogólny postęp i otrzymam mniej skokowy pasek postępu.

byłem w stanie realizować to przez (ab) przy użyciu właściwości TVCLUnzip.FilesList.Objects do „transfer” niektórzy za plików o kategorii w produkt OnStartZip obsługi, gdzie można następnie manipulować ZipHeader.directory, ale to wydaje się zbyt skomplikowana i delikatna, więc mam nadzieję, istnieje prostsze rozwiązanie, którego po prostu nie widzę. Jakieś pomysły?

+0

Pomoc online dla 'OnStartZip' ma przykład, który zmienia ścieżki w ostatniej chwili i wspomina, które inne właściwości można bezpiecznie zmienić. Jedyną rzeczą, która jest nieco bardziej skomplikowana, jest uzyskanie prawidłowych informacji na podstawie przekazanej nazwy pliku i już udało się to rozwiązać. Zachowałbym to w ten sposób. – hvd

Odpowiedz

0

Możesz to zrobić w jednym połączeniu ZIP. Wystarczy wypełnić TVCLZip.FileList i 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'); 
...... 

i zdefiniować TVCLZip.OnStartZip. Użyłem tej strategii w moim projekcie i działa dobrze. Na przykład:

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; 

Możesz ustawić katalog ZipHeader.directory na dowolną wartość, która ma być plikiem źródłowym w pliku ZIP.

Powiązane problemy