Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al crear zip y añadirle archivos. (https://www.clubdelphi.com/foros/showthread.php?t=96061)

pgranados 17-01-2023 20:33:41

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.

Código Delphi [-]
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:

Código Delphi [-]
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 (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

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 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 (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?

Código Delphi [-]
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

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.

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

Cita:

Empezado por pgranados (Mensaje 550100)
... 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).


La franja horaria es GMT +2. Ahora son las 18:51:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi