2012-07-27 21 views
5

Tenemos archivos que están agrupados en diferentes categorías, por ejemplo CatA .. CatD. Cada categoría tiene una carpeta asociada que puede ser configurada por el usuario. Por ejemplo, CatA va a C:\Path\To\CatA, CatB a C:\Path\To\CatB y CatC y CatD va al C:\Path\To\CatCD.VCLZip: directorios "virtuales" en el archivo zip

Ahora quiero hacer copia de seguridad y restaurar estos archivos en/desde un archivo zip de acuerdo con una especificación como

[CatA] 
SomeFile.abc 
*.txt 

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

El archivo zip resultante debe tener una estructura como

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

he conseguido este con VCLZip realizando llamadas múltiples a los métodos Zip y UnZip(Selected) por trabajo y un poco de hackeo con la propiedad Pathname. Sin embargo, preferiría una llamada a Zip/UnZip(Selected) para que VCLZip pueda calcular el progreso general con más precisión y obtengo una barra de progreso menos vacilante.

que fue capaz de poner en práctica este por (ab) uso de los TVCLUnzip.FilesList.Objects propiedades de "transferencia" alguna por categoría de información de archivo en un controlador OnStartZip donde puede entonces manipular ZipHeader.directory, pero esto parece demasiado complicado y frágil, así que espero hay una solución más directa que simplemente no veo. ¿Algunas ideas?

+0

La ayuda en línea para 'OnStartZip' tiene un ejemplo que cambia las rutas en el último momento y menciona qué otras propiedades se pueden cambiar sin peligro. Lo único que es un poco más complicado para usted es recuperar la información correcta basada en el nombre del archivo pasado, y ya logró resolver eso. Lo mantendría así. – hvd

Respuesta

0

Puede hacerlo en una sola llamada ZIP. Rellene TVCLZip.FileList y 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'); 
...... 

y definir TVCLZip.OnStartZip. He usado esta estrategia en mi proyecto y funciona bien. Por ejemplo:

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; 

Es posible ajustar ZipHeader.directory a cualquier valor que necesita para ser una carpeta de fuentes en un archivo ZIP.

Cuestiones relacionadas