PDA

Ver la Versión Completa : Problemas con la llamada a winexec


quake2420
18-07-2005, 10:33:56
Hola compañeros del foro, mi duda es la siguiente:
Estoy haciendo un programa y lo que quiero es cada vez que guardo unos datos me guardo en la carpeta donde guardo esos datos un archivo .zip.
Como lo tengo hecho ahora lo que hago primeo es copiar todos los archivos a comprimir a la carpeta donde esta el ejecutable del 7zip, una vez copiados los archivos a esa carpeta, lo que hago es ejecutar el winexec que lo que hace es cargarme un archivo .bat, el cual, lo que hace es situarme en el directorio donde esta el ejecutable del zip y luego crearme el zip, una vez que he ejecutado el winexec, ejecuto un sleep para que no tenga problemas de ejecucion.
El problema es que la primera vez que ejecuto el programa la llamada winexec no hace nada pero las restantes veces que lo ejecuto lo hace sin problema:
Las lineas que tengo en el programa son las siguientes:

rutaT:=directorio + '\';
//Creacion del archivo zip donde se guarda
//los archivos wpa, xml y dtd
copyfile(PChar(rutaT + 'contenido.xml'),
PChar(rutazp + 'contenido.xml'),existe);
copyfile(PChar(rutaT + 'estilo.xml'),
PChar(rutazp + 'estilo.xml'),existe);
copyfile(PChar(rutaT + 'nuevo.dtd'),
PChar(rutazp + 'nuevo.dtd'),existe);
copyfile(PChar(rutaT + nombreA + '.wpa'),
PChar(rutazp + nombreA + '.wpa'),existe);
rutazp1:='"'+rutazp+'"';
zipf:=nombreA + '.wzp';
wpaf:=nombreA+'.wpa';
diractual:=SetCurrentDir(rutazp);
winexec(Pchar('crearzip.bat ' + rutazp1 + ' ' + zipf + ' '
+ wpaf),SW_hide);
sleep(1000);
copyfile(PChar(rutazp + zipf),PChar(rutaT + '\' + zipf),existe);
deletefile(PChar(rutazp + 'contenido.xml'));
deletefile(PChar(rutazp + 'estilo.xml'));
deletefile(PChar(rutazp + 'nuevo.dtd'));
deletefile(PChar(rutazp + wpaf));
deletefile(PChar(rutazp + zipf));


Gracias a todos por adelantado

dec
18-07-2005, 11:06:06
Hola,

Por favor, embebe el código Delphi dentro de las etiquetas correspondientes. El no hacerlo ha provocado que yo te plantee algo que no tiene nada que ver con la pregunta que has formulado: ¿Porqué no utilizas unos componentes como los TurboPower Abbrevia (http://sourceforge.net/projects/tpabbrevia/) (1) para comprimir los archivos que te sean menester?

Hay más componentes para realizar esa misma tarea, empero, te digo que pruebas los susomentados porque a mí me van de miedo, lógicamente, y porque en unas cuantas líneas de código tienes tu problema resulto de una forma mucho más elegante que usando un programa "de terceros", como haces o quieres hacer ahora.

1. Estos componentes son gratuitos y de "código abierto".

Actualización: Abajo puede verse cómo comprimir en un archivo Zip los archivos de una determinada carpeta, haciendo uso de uno de los componentes incluidos en el paquete TurboPower Abbrevia (http://sourceforge.net/projects/tpabbrevia/):


procedure TForm1.Button1Click(Sender: TObject);
var
zip: TAbZipKit; // TurboPower Abbrevia
begin
zip := TAbZipKit.Create(Self);
zip.FileName := 'C:\archivo.zip';
zip.AddFiles('C:\archivos\*.*', faAnyFile);
zip.Save;
zip.Free;
end;

Evidentemente el componente "TAbZipKit" da mucho más de sí, siendo posible fijar determinadas opciones que en el ejemplo de más arriba, sin embargo, no se ha visto necesario emplear.

delphi.com.ar
18-07-2005, 14:39:51
...una vez que he ejecutado el winexec, ejecuto un sleep para que no tenga problemas de ejecucion...
¿Porqué crees que el Sleep te salvará de problemas?
Leete este hilo: http://www.clubdelphi.com/foros/showthread.php?t=23424