![]() |
Error al crear zip y añadirle archivos.
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.
|
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:
|
En mi máquina ese código también funciona corectamente.
Compilado con Delphi 11.2 Patch 1 No uso Winrar, pero con 7Zip (a mi entender mejor que Winrar) funciona correctamente. |
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.
|
Cita:
¿Sabrás que puede estar pasando?
|
Eureka
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.
|
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. |
Cita:
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). |
La franja horaria es GMT +2. Ahora son las 10:03:31. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi