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
public
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}
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;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := MsgApp;
end;
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;
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.