Ir al contenido


Foto

Copiar archivos con CopyFileEx y barra de progreso en delphi


  • Por favor identifícate para responder
5 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.965 mensajes
  • LocationMadrid - España

Escrito 07 julio 2010 - 04:42

Un ejemplo sencillo en delphi para copiar archivos con la API CopyFileEx, una barra de progreso, un botón de inicio y un botón de cancelación.


delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ComCtrls, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Button2: TButton;
  13.     ProgressBar1: TProgressBar;
  14.     procedure Button1Click(Sender: TObject);
  15.     procedure Button2Click(Sender: TObject);
  16.   private
  17.     { Private declarations }
  18.   public
  19.     { Public declarations }
  20.   end;
  21.  
  22. var
  23.   Form1: TForm1;
  24.   Cancel: boolean;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29. function ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Pointer): DWORD; stdcall;
  30. var
  31.   Value: integer;
  32. begin
  33.   Application.ProcessMessages();
  34.   if(dwCallbackReason = CALLBACK_CHUNK_FINISHED) then
  35.       Form1.ProgressBar1.Position:= (int64(TotalBytesTransferred) * 100) div int64(TotalFileSize);
  36.  
  37.   Result:= PROGRESS_CONTINUE;
  38. end;
  39.  
  40.  
  41. procedure TForm1.Button1Click(Sender: TObject);
  42. begin
  43.   Cancel:= false;
  44.   CopyFileEx(Fuente, Destino, @ProgressRoutine, nil, @Cancel, 0);
  45.   ShowMessage(SysErrorMessage(GetLastError()));
  46.  
  47. end;
  48.  
  49. procedure TForm1.Button2Click(Sender: TObject);
  50. begin
  51.   Cancel:= true;
  52. end;
  53.  
  54. end.


También para Builder aquí.

Saludos.
  • 2

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 25 noviembre 2016 - 04:04

Retomando el tema ahora que haré uso de éste método, tengo las siguientes inquietudes:

 

- ¿Está probado en qué versiones de SO?, ya que no lo especificas, en mi caso serían las tres versiones recientes Win 7,8 y 10.

- ¿Está probado en la copia de archivos en redes compartidas?.

 

Saludos.


  • 0

#3 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 noviembre 2016 - 05:26

Es soportada a partir de Windows XP
 

Requirements

 

Minimum supported client:  XP [desktop apps only]

Minimum supported server:  Server 2003 [desktop apps only]

 
Fuente


Editado por Agustin Ortu, 25 noviembre 2016 - 05:27 .

  • 0

#4 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 noviembre 2016 - 05:29

Para copiar archivos en LAN, deberias usar la API TransmitFile

 

Extracto de aca

 

Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 and Windows XP:  If you are writing an application that is optimizing file copy operations across a LAN, consider using the TransmitFile function from Windows Sockets (Winsock). TransmitFile supports high-performance network transfers and provides a simple interface to send the contents of a file to a remote computer. To use TransmitFile, you must write a Winsock client application that sends the file from the source computer as well as a Winsock server application that uses other Winsock functions to receive the file on the remote computer.


Editado por Agustin Ortu, 25 noviembre 2016 - 05:29 .

  • 0

#5 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.965 mensajes
  • LocationMadrid - España

Escrito 25 noviembre 2016 - 05:39

Retomando el tema ahora que haré uso de éste método, tengo las siguientes inquietudes:
 
- ¿Está probado en qué versiones de SO?, ya que no lo especificas, en mi caso serían las tres versiones recientes Win 7,8 y 10.
- ¿Está probado en la copia de archivos en redes compartidas?.
 
Saludos.

 
Funciona desde WinXP en adelante. También funciona en red local. Según tu necesidad puedes usar también SHFileOperation que te informa con el shell del estado de la copia como si estuvieras copiando desde el explorador. Si estás usando sockets puedes optar por TransmitFile que está optimizado para éstos.
 


delphi
  1. uses ShellApi;
  2.  
  3. function SHCopy(Source, Target: String): integer;
  4. var
  5.   FS: SHFILEOPSTRUCT;
  6. begin
  7.   ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT));
  8.   FS.wFunc:= FO_COPY;
  9.   FS.pFrom:= PCHAR(Source + #0 + #0);
  10.   FS.pTo:= PCHAR(Target + #0 + #0);
  11.   FS.fFlags:= FOF_NOCONFIRMATION + FOF_RENAMEONCOLLISION;
  12.   Result:= SHFileOperation(FS);
  13. end;

DP/ Caramba Agustin Ortu y yo nos hemos pisado.

Saludos.


  • 1

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 25 noviembre 2016 - 05:46

Gracias a ambos, estaré haciendo pruebas y les informo.


  • 0