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 02-01-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Listar una carpeta

Estaba intentando copiar (o cortar) una carpeta (Raíz), la idea es que primero me meta todos los archivos y carpetas (recursivamente, es decir, los ke estan dentro de estos también hasta el infinito y más allá) y luego con la función CopyFile ir item por item de la lista copiando a la nueva ruta, el problema está en listar los archivos recursivamente, tengo este procedimiento:
Código Delphi [-]
procedure PasteIfIsFolder(Folder: String; List: TStrings);
var
  SearchRec: TSearchRec;
begin
  if FindFirst(IncludeTrailingPathDelimiter(Folder)+'*.*', faAnyFile and not
               faSysFile, SearchRec) = 0 then
      repeat
      if (SearchRec.Name <> '.') or (SearchRec.Name <> '..') then
      begin
          List.Add(IncludeTrailingPathDelimiter(Folder)+SearchRec.Name);
        if DirectoryExists(IncludeTrailingPathDelimiter(Folder)+
                           SearchRec.Name) then
        PasteIfIsFolder(IncludeTrailingPathDelimiter(Folder)+
                        SearchRec.Name, List);
      end;
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
end;

Lo implemento de la siguiente forma, en el TAction de Copiar:
Código Delphi [-]
procedure TMainFRM.CopyActExecute(Sender: TObject);
begin
  if (ExplorerList.ItemIndex >= 0) then
  begin
    CutCopy.Folder := IncludeTrailingPathDelimiter(CurrLocalPath);
    CutCopy.FileName := ExplorerList.Selected.Caption;
    CutCopy.Option := tcoCopy;
    PasteAct.Enabled := True;
    if Copy(ExplorerList.Selected.SubItems[3],1,1) = 'D' then
    begin
      CutCopy.IsFolder := True;
      PasteIfIsFolder(CutCopy.Folder+CutCopy.FileName,ListBox1.Items);
    end
    else
      CutCopy.IsFolder := False;
  end;
end;

El problema es que el procedimiento recursivo no está bien, porque me hace un bucle que nunca termina. Cuál es el fallo? Espero haberme explicado bien, ando un poco liado...
__________________
l2prog.co.nr
Responder Con Cita
  #2  
Antiguo 02-01-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Si se trata de copiar o mover una carpeta tal vez te fuera útil hacer uso de la estructura "TSHFileOpStruct" que propone el API de Win32. Esto que ahora verás es una adaptación de cierto código que Román publicó en su día para copiar o mover archivos... o puede que carpetas, no lo recuerdo ahora mismo:

Código Delphi [-]
uses
  ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileOp: TSHFileOpStruct;
begin
  FillChar(FileOp, SizeOf(FileOp), #0);
  with FileOp do
  begin
    wFunc := FO_MOVE;
    Wnd := GetDesktopWindow;
    pTo := PChar('D:\carpeta');
    pFrom := PChar('C:\carpeta'+#0#0);
    fFlags := FOF_NOCONFIRMATION or
      FOF_SILENT or FOF_ALLOWUNDO;
  end;
  ShFileOperation(FileOp);
end;

El código de más arriba movería la carpeta "C:\carpeta" y todo su contenido (subdirectorios y archivos) a "D:\carpeta". De todos modos echa un vistazo a la ayuda (SDK Win32 que viene con Delphi) sobre "SHFileOpStruct" para ampliar información.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 02-01-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Muy interesante esta ayuda... Os confeso que nunca me había dado cuenta de que existia, muy estúpido por mi parte, nunca lo olvidaré...
__________________
l2prog.co.nr
Responder Con Cita
  #4  
Antiguo 03-01-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Gunman
(...) muy estúpido por mi parte (...)
Pues permíteme que te haga saber que yo no lo veo así en absoluto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 03-01-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Una vez más, fantástica la ayuda sobre la API Win32.
Dije lo de estúpido porque no sabía de su existenecia y me ha simplificado mucho las cosas, procedimientos que me ocupaban unas 10 línias se han traducido a una sola línia con las funciones que he encontrado en esta ayuda, realmente interesante, muchas gracias Dec!
__________________
l2prog.co.nr
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


La franja horaria es GMT +2. Ahora son las 05:11:41.


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