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)
-   -   Listar una carpeta (https://www.clubdelphi.com/foros/showthread.php?t=28784)

[Gunman] 02-01-2006 20:55:54

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...

dec 02-01-2006 22:14:29

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.

[Gunman] 02-01-2006 23:55:10

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é...

dec 03-01-2006 01:22:17

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. ;)

[Gunman] 03-01-2006 16:25:43

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!


La franja horaria es GMT +2. Ahora son las 23:35:38.

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