Ver Mensaje Individual
  #5  
Antiguo 01-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Arnol125,

Cita:
Empezado por Arnol125
...estoy tratando de copiar (Delphi y CopyFileEx) unas imágenes de una carpeta compartida en red a una carpeta en disco local...me sale el mensaje "Acceso Denegado"...Por DOS se puede copiar con comandos "xcopy \\Sistemas\e\Usuario\Escritorio\catalogo\*.* C:\catalogo"...


Cita:
Empezado por escafandra
...CopyFileEx...No admite comodines y sólo copia un archivo...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, FileCtrl;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  COPY_FILE_NO_BUFFERING = $1000;
  MsgApp = 'Presione Copy para iniciar copia Simple o Múltiple de Archivos';

var
  Form1: TForm1;
  Cancel : Boolean;

implementation

{$R *.dfm}

// Rutina de Callback de CopyFileEx
function CopyProgressRoutine(TotalFileSize : Int64;
                             TotalBytesTransferred : Int64;
                             StreamSize : Int64;
                             StreamBytesTransferred : Int64;
                             dwStreamNumber : Dword;
                             dwCallbackReason : Dword;
                             hSourceFile : THandle;
                             hDestinationFile : THandle;
                             lpData : Pointer) : DWORD; StdCall;
var
   Percent : Integer;

begin

   if dwCallbackReason = CALLBACK_CHUNK_FINISHED then
   begin
      Percent := Round(TotalBytesTransferred / TotalFileSize * 100);
      Form1.ProgressBar1.Position := Percent;
      Application.ProcessMessages;
   end;

   Result := PROGRESS_CONTINUE;

end;

// Inicializa Aplicación
procedure TForm1.FormCreate(Sender: TObject);
begin
   Label1.Caption := MsgApp;
end;

// Copia Simple ó Múltiple de Archivo(s)
procedure TForm1.Button1Click(Sender: TObject);
var
   FromFileName, ToFileName : String;
   openDialog : TOpenDialog;
   TargetDirectory : String;
   i : Integer;
   MsgUser : String;

begin

   openDialog := TOpenDialog.Create(self);
   openDialog.InitialDir := GetCurrentDir;
   openDialog.Options := [ofFileMustExist,ofAllowMultiSelect];
   openDialog.Filter := 'Files|*.*';

   if openDialog.Execute and SelectDirectory('Target Directory', 'C:\', TargetDirectory) then
   begin

      for i:= 0 to openDialog.Files.Count - 1 do
      begin

         FromFileName := openDialog.Files.Strings[i];
         ToFileName := TargetDirectory + '\' + ExtractFileName(openDialog.Files.Strings[i]);

         ProgressBar1.Position := 0;
         ProgressBar1.Min := 0;
         ProgressBar1.Max := 100;

         Cancel := False;

         Label1.Caption := Format('Copiando (%d/%d) %s a %s ',
                                  [i+1,openDialog.Files.Count,FromFileName,TargetDirectory]);

         CopyFileEx(PChar(FromFileName),
                    PChar(ToFileName),
                    @CopyProgressRoutine,
                    nil,
                    @Cancel,
                    COPY_FILE_RESTARTABLE or COPY_FILE_NO_BUFFERING);

         ProgressBar1.Position := 0;

         if Cancel then
         begin
            MsgUser := 'Copia Cancelada por el Usuario';
            MessageDlg(MsgUser,mtInformation,[mbOK],0);
            Exit;
         end;

      end;

      MsgUser := 'Copia de Archivos Realizada Satisfactoriamente';
      MessageDlg(MsgUser,mtInformation,[mbOK],0);

   end
   else
   begin
      MsgUser := 'No se Realizo Copia de Archivos por Falta de Parámetros';
      MessageDlg(MsgUser,mtError,[mbOK],0);
   end;

   openDialog.Free;

   Label1.Caption := MsgApp;

end;

// Cancela copia de Archivo(s)
procedure TForm1.Button2Click(Sender: TObject);
begin
   Cancel := True;
   ProgressBar1.Position := 0;
end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, permite copiar Uno o Múltiples Archivos por medio de la función CopyFileEx y visualizar el progreso de la copia, como se muestra en la siguiente imagen:



El código del ejemplo esta disponible en : CopyFileEx.rar

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 06-12-2014 a las 23:04:19.
Responder Con Cita