PDA

Ver la Versión Completa : Error al crear zip y añadirle archivos.


pgranados
17-01-2023, 20:33:41
Buen día compañeros, estoy teniendo un error al crear un zip y añadirle un archivo, no encuentro cual pueda ser el error, parece ser que el archivo.zip esta dañado, puesto a que lo quiero abrir con WinRAR y dice que el fichero esta dañado.


uses System.Zip;

var Zip:TZipFile;
ruta:string;


Zip := TZipFile.Create;
try
ruta:= 'C:\Users\Paul\Desktop\RESPALDO.ZIP';
Zip.Open(ruta, zmWrite);
Zip.Add('C:\Users\Paul\Desktop\Respaldos\Base.FBK');
finally
Zip.Free;
end;

dec
18-01-2023, 08:38:35
Hola a todos,

Al menos en Delphi 10.4 no puedo reproducir el problema, es decir, el siguiente código funciona como se espera, y, en efecto, puedo abrir el archivo "zip" con WinRar sin problemas:


var
Zip: TZipFile;
begin
Zip := TZipFile.Create;
try
Zip.Open(ExtractFilePath(ParamStr(0)) + 'My.zip', zmWrite);
Zip.Add(ExtractFilePath(ParamStr(0)) + 'Unit1.dcu');
finally
Zip.Free;
end;
end;

Neftali [Germán.Estévez]
18-01-2023, 12:28:51
En mi máquina ese código también funciona corectamente.
Compilado con Delphi 11.2 Patch 1
No uso Winrar, pero con 7Zip (https://www.7-zip.org/) (a mi entender mejor que Winrar) funciona correctamente.

pgranados
18-01-2023, 16:26:49
Gracias por su apoyo chicos, ya encontré el problema, estaba eliminando el archivo que "metía" en el .zip en el evento equivocado, "moví" la eliminación al evento OnClose y funciono de maravilla. Saludos.

pgranados
19-01-2023, 17:59:24
;550083']En mi máquina ese código también funciona corectamente.
Compilado con Delphi 11.2 Patch 1
No uso Winrar, pero con 7Zip (https://www.7-zip.org/) (a mi entender mejor que Winrar) funciona correctamente.

Hola Neftali, estoy teniendo un problema, necesito comprimir un archivo .FBK porque el modulo es para respaldar la base de datos del cliente, pero al crear el FBK con el GBAK utilizando shellExecute y quererlo comprimir en el .ZIP da un error, donde el archivo X.FBK no esta disponible o esta siendo usado por otra persona, pero si ejecuto este proceso utilizando un Stop y siguiendo cada linea con F8 no tengo problemas.

¿Sabrás que puede estar pasando?


ShellExecute(Handle, 'runas', PChar(psFichero), PChar(psInstruccion), nil, SW_HIDE);

lspaso:= ERuta.Text+'\'+Enombreresp.Text+'.ZIP';
lspaso2:= Eruta.Text+'\'+ENombreResp.Text+'.FBK';

Zip:= TZipFile.Create;
try
Zip.Open(lspaso, zmWrite);
Zip.Add(lspaso2);
finally
Zip.Free;
end;

pgranados
19-01-2023, 19:42:26
Por fin lo pude resolver, necesitaba usar un timer debido a que el proceso se ejecuta demasiado rápido y no da tiempo al sistema de saber si existe el archivo en el directorio.

Casimiro Notevi
20-01-2023, 09:56:26
Hacer eso es muy peligroso porque cualquier ordenador un poco más rápido o más lento puede traerte problemas.
Lo que tienes que hacer es crear el zip cuando sepas que se ha creado el fichero que vas a añadir al mismo.
No tenemos tu código ni sabemos qué componentes exactos usas, pero debes buscar algú envento del tipo "Terminate", "Finalize", etc... y ahí estarás seguro de que terminó de crearlo.
Si usas una llamada externa entonces cámbiala por una que vuelva cuando termina, y no una que simplemente hace la llamada y regresa, dejando el proceso en funcionamiento.

Neftali [Germán.Estévez]
20-01-2023, 11:49:11
... pero al crear el FBK con el GBAK utilizando shellExecute y quererlo comprimir en el .ZIP da un error, donde el archivo X.FBK no esta disponible o esta siendo usado por otra persona, pero si ejecuto este proceso utilizando un Stop y siguiendo cada linea con F8 no tengo problemas.

Sin ver completamente el código puedo imagirmar más o menos como es, aunque estaría mejor verlo para estar seguro.
Por lo que entiendo, lanzas 2 procesos uno detrás de otro, pero al ejecutar el segundo (ZIP), el primero todavía no ha finalizado (ShellExecute + GBAK).

Para estos casos en la sección de trucos y en los foros puedes buscar referencias a ShellExecuteAndWait. Se he hablado de él muchas veces.

Por decirlo así, es una función que hace lo moiismo que el ShellExecute, pero que además espera a que el proceso finalize antes de devolver el control al programa. Posíbleente esta función solucione tu problema sin necesidad de utilizar un Timer. Que tal y como dice [Casimiro] puede darte problemas en un futuro, si la velocidad de ejecución cambia o si la Base de Datos crece (por ejemplo).