Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Listar ficheros de un directorio y subdirectorios (https://www.clubdelphi.com/foros/showthread.php?t=76825)

Anel Hernandez 29-11-2011 19:46:59

Listar ficheros de un directorio y subdirectorios
 
Hola,

estoy intentando listar en un memo todos los archivos de un directorio y sus subdirectorios internos usando los trucos con recursividad del foro y no lo logro. Pudieran aclarar cual es mi error?

Código Delphi [-]
var
  SR: TSearchRec;
  dir:string;
  mascara: string;
begin
 dir := edit1.Text;
 mascara:='*.*';
 if FindFirst(edit1.Text + mascara, faAnyFile, SR) = 0 then
  begin
   repeat
    memo1.Lines.Add(SR.Name);
    if ((SR.Attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then
     Dir := Dir + SR.Name+'\';
    until FindNext(SR) <> 0;
    FindClose(SR);
 end;
end;

gracias

ecfisa 29-11-2011 19:56:27

Hola.

Si en Edit1.Text está la ruta, es muy probable que te falte una barra, probá de este modo:
Código Delphi [-]
  ...
 dir := IncludeTrailingPathDelimiter(edit1.Text);  // Incluye delimitador si no existe
 mascara:= '*.*';
 if FindFirst(dir + mascara, faAnyFile, SR) = 0 then
  ...

Saludos.

Anel Hernandez 29-11-2011 20:06:12

Hola,

pues sigue sin funcionar, solo me lista los del directorio raiz. No entra a los subdirectorios. Edit1.text si incluye \ pero no esta demas asegurarse.

Que hacer para que entre a los subdirectorios?

gracias

ecfisa 29-11-2011 20:49:10

Hola
Cita:

pues sigue sin funcionar, solo me lista los del directorio raiz.
En realidad funciona correctamente, es sólo que esa función sirve para listar los archivos y directorios de la ruta designada...

Cita:

No entra a los subdirectorios.
Que hacer para que entre a los subdirectorios?
Para lo que buscas hacer, revisá este enlace.

Saludos.

Anel Hernandez 30-11-2011 09:24:56

Eureka! lo logre!

lo comparto para el ke le pueda ser util en el futuro. Ya entendi la recursividad! La habia usado hace años en algunos metodos numericos pero nunca para un proceso de soft.

aki va:

Código Delphi [-]
procedure Rastrear (Dir:string);
var
 SR:TSearchRec;
 mascara: string;
begin
 mascara:='*.*';
 if FindFirst(dir + mascara, faAnyFile, SR) = 0 then begin
     repeat
     if ( (SR.Attr and fadirectory) = fadirectory) then
       begin
         if  (SR.Name <> '.')and (SR.Name <> '..') then
           Rastrear( Dir + SR.Name+'\' );
       end
     else
       begin
         form1.Memo1.Lines.Add (SR.Name);
       end;
     until FindNext(SR) <> 0;
     FindClose(SR);
 end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 Rastrear(edit1.Text);
end;

Anel Hernandez 30-11-2011 09:34:29

Hola,

cuando le pongo otra mascara, '*.txt' el procedimiento no se ejecuta si en el primer directorio no hay ningun .txt. Si le cambio la primera condicion a que siga revisando en otros subdirectorios independientemente no encuentre nada, entonces como seria la condicion de parada?

pueden sugerirme cualkier otra variante, gracias!

Neftali [Germán.Estévez] 30-11-2011 11:20:58

Pues hay un truco de David, en el foro (sección de Trucos) que funciona desde hace mucho tiempo (yo mismo lo uso en varios sitios).

Listar los archivos de un determinado directorio

Anel Hernandez 30-11-2011 12:20:40

Hola,

por lo que veo de ese truco hay que tener una lista de subdirectorios y revisar uno a uno con el procedimiento de busqueda de fichero. Es asi? En ese caso la funcion no es recursiva, se llama tantas veces como cantidad de directorios tengamos en la lista. No?

No es posible al mio ponerle alguna condicion logica para que si no encuentra un archivo en ese subdirectorio entre en los subdirectorios que encuentre?

Gracias

Neftali [Germán.Estévez] 30-11-2011 12:49:44

Cita:

Empezado por Anel Hernandez (Mensaje 419955)
Hola,

Hola.

Cita:

Empezado por Anel Hernandez (Mensaje 419955)
por lo que veo de ese truco hay que tener una lista de subdirectorios y revisar uno a uno con el procedimiento de busqueda de fichero. Es asi?

No, no has visto bien. ;-)
Revisa el primer comentario y el código incluído en él.

Cita:

Empezado por Anel Hernandez (Mensaje 419955)
En ese caso la funcion no es recursiva, se llama tantas veces como cantidad de directorios tengamos en la lista. No?

El código del primer comentario sí es recursivo, pues en su interior se vuelve a llamar a la misma función para escanear los subdirectorios.

Cita:

Empezado por Anel Hernandez (Mensaje 419955)
Gracias

De nada.


La franja horaria es GMT +2. Ahora son las 04:26:29.

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