Jump to content


Photo

Saber que un archivo se copio corectamente?


  • Please log in to reply
13 replies to this topic

#1 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 13 July 2011 - 11:55 AM

Necesito copiar un archivo de un directorio a otro. Uso el clasico:



delphi
  1. CopyFile(PChar(Dir + 'BackUp\Mari.dat'), PChar(Dir + 'Mari.dat'), false);



Pero yo quiero que cuando se termine de copiar al instante se elimine el directorio y el archivo. Y ademas ocurre que Mari.dat pesa digamos aprox 2Mb. asi que depende en la PC si ese copiado se hace rapido o lento.


delphi
  1.   CopyFile(PChar(Dir + 'BackUp\Mari.dat'), PChar(Dir + 'Mari.dat'), false);
  2.   DeleteFile(Dir + 'BackUp\Mari.dat');
  3.   RemoveDirectory(PChar(Dir + 'BackUp'));



Pero como Mari es muy pesada, esa gordis pesa mas de lo debido, necesito estar seguro si se copio ya.. yo imagino meter un while y usar el clasico FileExists para verificar y si es asi q pase a hacer lo siguiente y asi ps.. nose si esta bien o estoy por el mal camino?

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 13 July 2011 - 12:38 PM



delphi
  1.   if CopyFile(PChar(Dir + 'BackUp\Mari.dat'), PChar(Dir + 'Mari.dat'), false) then
  2.     if DeleteFile(Dir + 'BackUp\Mari.dat') then
  3.       RemoveDirectory(PChar(Dir + 'BackUp'));




Saludos.

  • 0

#3 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 13 July 2011 - 01:10 PM

Gracias escafandra pero igual, borra todo y no da la opurtunidad de que el archivo se copia del backup a el directorio..
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 13 July 2011 - 01:37 PM

Pues lo he probado con un archivo de 45 Mb y funciona, tu sólo tratas de copiar 2Mb.  :| ^o|

Puedes probar con la variante CopyFileEx con una función CALLBACK que controla el progreso... Aquí puse un ejemplo de su uso.



Saludos.
  • 0

#5 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 13 July 2011 - 10:27 PM

Imagino q mi problema esta que yo quiero hacer esto cuando estoy cerrando el programa y hay ciertas cosas que no se respeta.



delphi
  1. procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);//procedure TForm2.FormDestroy(Sender: TObject);
  2. begin
  3.   DeleteFile(launcherLS + 'Mari.dat');
  4.   Sleep(500);
  5.   if CopyFile(PChar(launcherLS + 'BackUp\Mari.dat), PChar(launcherLS + 'Mari.dat'), false) then
  6.     if DeleteFile(launcherLS + 'BackUp\Mari.dat') then
  7.       RemoveDirectory(PChar(launcherLS + 'BackUp'));
  8.   Sleep(5000);
  9.   Application.Terminate;
  10. end;



Quizas e ahi mi error?

  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 14 July 2011 - 12:15 AM

¿Has hecho un debug paso a paso?. ¿Que pasa con los archivos?.
¿Los nombres y rutas son correctos?
¿Has cerrado los Handles del archivo antes de realizar las acciones de copia y borrado?

¿Porqué CopyFile y no usas MoveFile?


Saludos.

  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 14 July 2011 - 06:03 AM

Creo que esos "sleep" te sobrarian, esas instruciones son secuenciales, hasta que no borra o copia el fichero no te devuelve el control, con lo que *creo* que sobran los sleep pero te faltaria un "if deletefile", porque el fichero podria seguir en uso y no te darias cuenta sin un if al borrarlo.

Yo personalmente cuando quiero asegurarme de que un fichero existe y esta usable, intento conectarme a el en modo exclusivo a ver si me deja o no, y si me deja, el fichero esta libre:



delphi
  1. try
  2.   TmpFile:= TFileStream.create(Fic, fmOpenRead or fmShareExclusive);
  3.   TmpFile.free;
  4.   ShowMessage('Fichero libre');
  5. except
  6.   ShowMessage('Fichero en uso');
  7. end;


  • 0

#8 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 15 July 2011 - 12:37 PM

Lo que hago ahora es esto:



delphi
  1. procedure TForm2.FormShow(Sender: TObject);
  2. begin
  3.   RenameFile(launcherLS + 'd3d9.dll', launcherLS + 'd3d9_.dll');
  4. end;
  5.  
  6. procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
  7.   begin
  8.     DeleteFile(launcherLS + 'd3d9.dll');
  9.     RenameFile(launcherLS + 'd3d9_.dll', launcherLS + 'd3d9.dll');
  10.     Application.Terminate;
  11.   end;
  12.  
  13.   procedure TForm2.FormDestroy(Sender: TObject);
  14.   begin
  15.     DeleteFile(launcherLS + 'd3d9.dll');
  16.     RenameFile(launcherLS + 'd3d9_.dll', launcherLS + 'd3d9.dll');
  17.     Application.Terminate;
  18.   end;



Cuando se abre el form que me renombre el archivo a otro nombre en la misma ubicacion, luego de esto cuando se cierre la aplicacion de cualquier forma... que me borre el archivo que puse otro un wrapper y que el archivo original que estaba q lo renombre a su origininal nombre. pero esto no pasa nose porque? cuando cierro el proceso no le da tiempo para hacer todo ya que se manda directo a cerrar sin hacer caso a mis sentencias?
  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 15 July 2011 - 01:37 PM

cuando cierro el proceso no le da tiempo para hacer todo ya que se manda directo a cerrar sin hacer caso a mis sentencias?


La opción de renombrar es la mejor...

¿Como cierras la aplicación? Application.Terminate Sobra, ¿No estarás llamando a ese procedimiento desde otro sitio?


Saludos.
  • 0

#10 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 15 July 2011 - 02:36 PM

Escribo esto, porque como se cargan dos forms o mas y es mas seguro que se cierre todo el project completo o toda la aplicacion con todas sus ventanas que genero.
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 15 July 2011 - 02:56 PM

Pues Application.Terminate es el origen de tu problema, esto hace que no se genere el evento OnClose...

Cámbialo por:


delphi
  1. Application.MainForm.Close;




Saludos.


  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 15 July 2011 - 10:13 PM

Hola,

Escafandra, yo tengo una duda... en varios lados he leído que se estila usar MoveFile() por sobre CopyFile(). ¿Que tiene de especial MoveFile() por sobre CopyFile()? ¿Acaso MoveFile() no borra el contenido original una ves movido éste?

Saludos,

  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 16 July 2011 - 04:29 AM

Hola,

Escafandra, yo tengo una duda... en varios lados he leído que se estila usar MoveFile() por sobre CopyFile(). ¿Que tiene de especial MoveFile() por sobre CopyFile()? ¿Acaso MoveFile() no borra el contenido original una ves movido éste?

Saludos,


Momentos antes salir de vacaciones no he resistido conectarme...

Si usas CopyFile luego debes borrarlo. MoveFile es mejor no porque te ahorre borrar sino porque en realidad no copia, sólo renombra el archivo (la ruta completa) con lo que es mucho mas rápido, sobre todo si el archivo es muy pesado. Esto es así si estamos moviéndolo dentro de la misma unidad de disco, en otro casi si que copia y borra.


Saludos.
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 16 July 2011 - 10:25 AM

Hola,

Muchas gracias por aclararme la duda y de darte el tiempo de una última conexión y pasada antes se salir de vacaciones. Ahora puedes disfrutar de tu viaje a la playa.

Saludos,

  • 0




IP.Board spam blocked by CleanTalk.