Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   error copiando multiples archivos (https://www.clubdelphi.com/foros/showthread.php?t=79802)

jonydread 11-08-2012 17:09:35

error copiando multiples archivos
 
amigos necesito copiar varios archivos pero busque aca en el foro y en google y no entiendo muy bien salen ejemplos de copiar carpetas completas solamente y yo necesito copiar solo ciertos archivos seleccionados en fin este es el codigo que encontre
Código Delphi [-]
function CopiaTodo(Origen,Destino : String) :
 LongInt;
 var
 F : TShFileOpStruct;
 sOrigen, sDestino : String;
 begin 
 Result := 0;
 sOrigen := Origen + #0;
 sDestino := Destino + #0;

 with F do
 begin
 Wnd := Application.Handle;
 wFunc := FO_COPY;
 pFrom := @sOrigen[1];
 pTo := @sDestino[1];
 fFlags := FOF_MULTIDESTFILES;
 end;
 Result := ShFileOperation(F);
 end;
lo aplico asi
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
origen, destino: string;
begin
for i:= 0 to Opendialog1.Files.Count-1 do
origen:= opendialog1.Files[i];
destino:=extractfilepath(opendialog1.Files[i]);
CopiaTodo(origen, destino);

end;

me dice stringlisterror - list index out of bounds()

como podria hacerlo??

escafandra 11-08-2012 18:18:03

Prueba así:

Código Delphi [-]
function FCopy(Handle: HWND; From, Dest: String): integer;
var
  FS: SHFILEOPSTRUCT;
begin
  ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT));
  FS.wnd:= Handle;
  FS.wFunc:= FO_COPY;
  FS.pFrom:= PCHAR(From + #0#0);
  FS.pTo:=   PCHAR(Dest + #0#0);
  FS.fFlags:= FOF_NOCONFIRMATION;
  Result:= SHFileOperation(FS);
end;

Ejemplo de uso:
Código Delphi [-]
FCopy(Handle, 'D:\Cazador\*.*', 'D:\Cazador2\otra');
Se copian todos los archivos de la carpeta D:\Cazador a la carpeta D:\Cazador2\otra si no existe la carpeta la crea.

Saludos.

jonydread 11-08-2012 19:22:08

Cita:

amigos necesito copiar varios archivos pero busque aca en el foro y en google y no entiendo muy bien salen ejemplos de copiar carpetas completas solamente y yo necesito copiar solo ciertos archivos seleccionados
amigo no necesito copiar una carpeta necesito copiar algunos archivos seleccionados, dada la ruta en un listview probe con copyfile pero solo copia uno y necesito hacer una copia de multiples archivos

gracias por la ayuda!!

escafandra 11-08-2012 19:45:42

Perdona, no te entendí bien. Tu quieres pasar una lista de múltiples archivos a copiar en una carpeta...

En ese caso quizás te interese la solución que propuse aquí.



Saludos.

jonydread 11-08-2012 21:16:42

ya habia visto ese mensaje pero no se porque no me funciona lo aplico asi
Código Delphi [-]
uses shellapi
procedure CreatePath(Path: string);
var
  l, fin: integer;

begin
   l:= Length(Path);
   fin:= 0;
   repeat
     if (Path[fin] = '\') or (l = 0) then

     begin
       if l>0 then Path[fin]:= #0;
       CreateDirectory(PCHAR(Path), 0);
       if l>0 then Path[fin]:= '\';
     end;

     inc(fin); dec(l);
   until (l<0);
end;
function XCopy(Handle: HWND; From: TStrings; Dest: String): integer;
var
  FS: SHFILEOPSTRUCT;
  SFrom: string;
begin

  Result:= -1;
  if(From.Count > 0) or (Dest <> '') then
  begin
    CreatePath(PCHAR(Dest));
    SFrom:= StringReplace(From.Text, #13+#10, #0, [rfReplaceAll]);

    ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT));
    FS.wnd:= Handle;
    FS.wFunc:= FO_COPY;
    FS.pFrom:= PCHAR(SFrom + #0);
    FS.pTo:=   PCHAR(Dest + #0);
    FS.fFlags:= FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION;

    Result:= SHFileOperation(FS);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
origen, destino: string;
begin
for i:= 0 to Opendialog1.Files.Count-1 do
origen:= opendialog1.Files[i];
destino:=extractpath(opendialog1.Files[i]);
 XCopy(Handle, origen, destino);

end;

Casimiro Notevi 11-08-2012 21:54:04

¿No funciona? :confused:
¿Sale algún error?, ¿no copia?, ¿copia lo que no tiene que copiar?, ¿no hace nada? ...

jonydread 11-08-2012 22:18:10

sale esto
CreateDirectory(PCHAR(Path), 0); --->constant 0 converter to nil
XCopy(Handle, origen, destino); -----> incopatible type Tstrings and string

cambie esta parte y funciona pero crea nueva carpeta y no me copia nada :(
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
origen, destino: string;
list : Tstrings;
begin
list := tstringlist.Create;
for i:= 0 to Opendialog1.Files.Count-1 do
list.Add(opendialog1.Files[i]);
destino:= 'C:\\nuevo';
 XCopy(Handle, list, destino);

end;

esas lineas
me salen con error

escafandra 12-08-2012 01:02:49

Tu principal error es confundir un String con un TStrings. El segundo básicamente es una lista de elementos String.
"constant 0 converter to nil" no es un error, es una advertencia de que el valor constante cero se va a convertir en un puntero nil (pongo cero en lugar de nil por costumbre y vicio del lenguaje C)

Fíjate en este sencillo código que funciona perfectamente en delphi 7:
Código Delphi [-]
begin
  OpenDialog1.Options := [ofAllowMultiSelect];
  if OpenDialog1.Execute then
    XCopy(Handle, OpenDialog1.Files, 'D:\prueba');
end;

Saludos.

jonydread 12-08-2012 02:49:23

mira amigo no se que estoy asiendo mal dejo el codigo donde estoy asiendo pruebas haber si me hechan una manito porfavor
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure CreatePath(Path: string);

var

  l, fin: integer;

begin

   l:= Length(Path);

   fin:= 0;

   repeat

     if (Path[fin] = '\') or (l = 0) then

     begin

       if l>0 then Path[fin]:= #0;

       CreateDirectory(PCHAR(Path), nil);

       if l>0 then Path[fin]:= '\';

     end;

     inc(fin); dec(l);

   until (l<0);

end;
function XCopy(Handle: HWND; From: TStrings; Dest: String): integer;

var

  FS: SHFILEOPSTRUCT;
  SFrom: string;

begin

  Result:= -1;

  if(From.Count > 0) or (Dest <> '') then

  begin

    CreatePath(PCHAR(Dest));
    SFrom:= StringReplace(From.Text, #13+#10, #0, [rfReplaceAll]);

    ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT));
    FS.wnd:= Handle;
    FS.wFunc:= FO_COPY;
    FS.pFrom:= PCHAR(SFrom + #0);
    FS.pTo:=   PCHAR(Dest + #0);
    FS.fFlags:= FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION;

 

    Result:= SHFileOperation(FS);

  end;

end;
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Execute
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
begin
for i:= 0 to Opendialog1.Files.Count-1 do
XCopy(Handle, Opendialog1.Files, 'C:\\nuevo');

end;

end.

escafandra 12-08-2012 16:09:41

¿Porqué no miras el ejemplo que te dejé arriba?.

En la ayuda de delphi busca TOpenDialog y estúdiate bien como se usa.


Saludos.

Casimiro Notevi 12-08-2012 16:17:28

Cita:

Empezado por jonydread (Mensaje 439402)
mira amigo no se que estoy asiendo mal dejo el codigo donde estoy asiendo pruebas haber si me hechan una manito porfavor

Hombre, pero haz caso de escafandra, para algo se ha molestado en ponerte el código y explicarte, si ni siquieras lo copias bien, ¿qué esperas? ;)

jonydread 13-08-2012 05:20:03

lo siento no soy un profesional en esto mas bien un aficionado gracias por todo revisare bien

jonydread 14-08-2012 02:03:39

en fin solo tenia que mirar la funcion
no me percate y la linea debia ser asi
Código Delphi [-]
function XCopy(Handle: HWND; From,Dest: String): integer;
y otro detalle que no se en que andaba pero no lo veia era que puse doble "\\"
quedo asi funcionando perfecto
Código Delphi [-]
XCopy(Handle, openDialog1.Files[i], 'C:\nuevo');

escafandra 14-08-2012 08:52:35

Cita:

Empezado por jonydread (Mensaje 439537)
en fin solo tenia que mirar la funcion
no me percate y la linea debia ser asi
Código Delphi [-]
function XCopy(Handle: HWND; From,Dest: String): integer;

y otro detalle que no se en que andaba pero no lo veia era que puse doble "\\"
quedo asi funcionando perfecto
Código Delphi [-]
XCopy(Handle, openDialog1.Files[i], 'C:\nuevo');

:eek::eek::eek:

Pues la función que yo escribí no es como tu dices sino así:
Código Delphi [-]
function XCopy(Handle: HWND; From: TStrings; Dest: String): integer;
Y por tanto su uso:
Código Delphi [-]
XCopy(Handle, OpenDialog1.Files, 'D:\prueba');


Saludos.


La franja horaria es GMT +2. Ahora son las 03:19:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi