Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-08-2012
jonydread jonydread is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 157
Poder: 13
jonydread Va por buen camino
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??
Responder Con Cita
  #2  
Antiguo 11-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 11-08-2012 a las 18:21:11.
Responder Con Cita
  #3  
Antiguo 11-08-2012
jonydread jonydread is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 157
Poder: 13
jonydread Va por buen camino
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!!
Responder Con Cita
  #4  
Antiguo 11-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #5  
Antiguo 11-08-2012
jonydread jonydread is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 157
Poder: 13
jonydread Va por buen camino
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;
Responder Con Cita
  #6  
Antiguo 11-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿No funciona?
¿Sale algún error?, ¿no copia?, ¿copia lo que no tiene que copiar?, ¿no hace nada? ...
Responder Con Cita
  #7  
Antiguo 11-08-2012
jonydread jonydread is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 157
Poder: 13
jonydread Va por buen camino
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

Última edición por jonydread fecha: 11-08-2012 a las 22:29:40.
Responder Con Cita
  #8  
Antiguo 12-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #9  
Antiguo 12-08-2012
jonydread jonydread is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 157
Poder: 13
jonydread Va por buen camino
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.

Última edición por jonydread fecha: 12-08-2012 a las 03:03:14.
Responder Con Cita
  #10  
Antiguo 12-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
¿Porqué no miras el ejemplo que te dejé arriba?.

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


Saludos.
Responder Con Cita
  #11  
Antiguo 12-08-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jonydread Ver Mensaje
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?
Responder Con Cita
  #12  
Antiguo 13-08-2012
jonydread jonydread is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 157
Poder: 13
jonydread Va por buen camino
lo siento no soy un profesional en esto mas bien un aficionado gracias por todo revisare bien
Responder Con Cita
  #13  
Antiguo 14-08-2012
jonydread jonydread is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 157
Poder: 13
jonydread Va por buen camino
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');
Responder Con Cita
  #14  
Antiguo 14-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por jonydread Ver Mensaje
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');


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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error Con multiples accesos a WebService elcopa Varios 0 30-09-2011 00:59:51
Uno o multiples archivos luis.gutierrez API de Windows 4 06-04-2010 18:51:24
Instalando/Copiando archivos, etc... Xianto Varios 2 09-08-2008 04:17:56
Open dialog y multiples archivos b2k Varios 3 16-09-2007 23:22:37
Copiando archivos cone220 API de Windows 3 23-06-2003 14:43:28


La franja horaria es GMT +2. Ahora son las 20:29:01.


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