Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   recorrido por directoris buscando archivos (https://www.clubdelphi.com/foros/showthread.php?t=23783)

rfernandez 28-07-2005 13:53:34

recorrido por directoris buscando archivos
 
Que funciones utilizais para hacer recorridos recursivos por directorios buscando archivos.

Yo he utilizado siempre el Findfirst y findnext pero en algunas maquinas con windows xp o windows 2000 no se porque pero directorios con archivos me devuelve que no hay nada.
La busqueda no lo hago de todo sino que filtro por una extensión determinada.

Ha alguien le ha ocurrido algo parecido.

Gracias.

Neftali [Germán.Estévez] 28-07-2005 14:02:17

Esos son los que hay y deberían funcionar.
Tal vez no estés utilizando el código correcto.

En la sección de trucos del club tienes un par de recorridos de ejemplo; Creo que son los trucos 333 y 310; Son para borrar, pero el recorrido recursivo que hacen es válido (simplemente que en tu caso no borrarás).

rfernandez 28-07-2005 14:34:21

El problema no lo tengo en el algoritmo si no en la maquina.
El algoritmo que tengo funciona perfectamente pero hay en maquinas que no funciona.

Mi pregunta es por alguien se habia encontrado que algun tipo de maquina con winxp le habia echo cosas raras estas funciones.

Gracias.

Neftali [Germán.Estévez] 28-07-2005 15:18:25

Revisa la documentación de ésta API: FindFirstFile ya que la función de Delphi la utiliza.
Otra opción es hacer directamente la prueba con las funciones de la API, a ver qué pasa en esos ordenadores.

mamcx 28-07-2005 16:38:39

Debes estar recorriendo carpetas del sistema u ocultas. Las opciones que dices requieren que se especifique que tipo de archivos se van a listar...

dec 28-07-2005 16:46:23

Hola,

Cita:

Empezado por rfernandez
El algoritmo que tengo funciona perfectamente pero hay en maquinas que no funciona.

¿Cabría la posibilidad de que lo copiaras aquí? Dicen que cuarenta ojos ven más que dos...

rfernandez 28-07-2005 19:11:08

Antes de nada preguntar cual es la funcion FindFirstFile que propone Netfali ya que no la encuentro solo encuentro la FindFirst y FindNext.
Basicamente el siguiente algoritmo busca los archivos con extensión '*.ia' que son un .txt para colocarlos dentro de un TTreeView, teniendo en cuenta que desde el directorio original donde se empieza a mirar, que se envia mediante el parametro de entrada 'Cami', pueden haber subdirectorios en 'infinitas' profundidades donde halla archivos *.ia

El algoritmo es el siguiente.

Código Delphi [-]
 procedure TfrmConsultaLliure2.Carregar( Cami: String; Pare: TTreeNode);
 var
   Filtre: String;
   Fit,Dir: TSearchRec;
   Nod: TTreeNode;
   x: integer;
 begin
   // Busquem totes les consultes predefinides .ia;
   Filtre := Cami+'*.ia';
   if FindFirst(Filtre,faAnyFile,Fit) = 0 then begin
     with Ar.Items.AddChild(Pare,Copy(Fit.Name,1,Length(Fit.Name)-3)) do begin
       ImageIndex := 1;
       SelectedIndex := 1;
     end;
     while FindNext(Fit) = 0 do
       with Ar.Items.AddChild(Pare,Copy(Fit.Name,1,Length(Fit.Name)-3)) do begin
         ImageIndex := 1;
         SelectedIndex := 1;
       end;
   end;
   FindClose(Fit);
   // Ara busquem els subdirectoris
   Directori.Root := Cami;
   for x:=0 to Directori.Items.Count-1 do begin
     Nod := Ar.Items.AddChild(Pare,UpperCase(Directori.Folders[x].Displayname));
     Nod.ImageIndex := 0;
     Nod.SelectedIndex := 0;
     Carregar(Cami+Directori.Folders[x].DisplayName+'\',Nod);
     Directori.Root := Cami;
   end;
 end;

dec 28-07-2005 21:56:46

Hola,

Personalmente no encuentro problemas utilizando el siguiente procedimiento en Windows XP Service Pack 2:

Código Delphi [-]
(*
 
   Busca y lista los archivos que cumplan con determinada
   máscara y que se encuentren en un determinado directorio
   y/o dentro de los subdirectorios del mismo.
 
   Parámetros:
 
   directorio: en el que buscar, por ejemplo: C:\
   mascara: de archivo, por ejemplo: *.txt
   atributos: de los archivos, por ejemplo: faAnyFile
   listado: donde guardar los posibles resultados (1)
 
   (1) Rutas completas de los archivos encontrados
 
 *)
 
 procedure BuscarArchivos(const directorio, mascara: string;
   atributos: Integer; var listado: TStrings);
 
 // Procedimiento anidado
 //
 procedure Buscar(const subdirectorio: string);
 var
   regBusqueda: TSearchRec;
 begin
   // Buscar en el directorio
   if FindFirst(subdirectorio + mascara, atributos, regBusqueda) = 0 then
   begin
     try
       repeat
         Application.ProcessMessages;
         if (regBusqueda.Attr and faDirectory = 0)
           or (regBusqueda.Name <> '.')
             and (regBusqueda.Name <> '..') then
               listado.Add(subdirectorio + regBusqueda.Name);
       until FindNext(regBusqueda) <> 0;
     except
       FindClose(regBusqueda);
     end;
     FindClose(regBusqueda);
   end;
   // Buscar en los subdirectorios
   if FindFirst(subdirectorio + '*', atributos
     or faDirectory, regBusqueda) = 0 then
   begin
     try
       repeat
         Application.ProcessMessages;
         if ((regBusqueda.Attr and faDirectory) <> 0)
           and (regBusqueda.Name <> '.')
             and (regBusqueda.Name <> '..') then
               Buscar(subdirectorio + regBusqueda.Name + '\');
       until FindNext(regBusqueda) <> 0;
     except
       FindClose(regBusqueda);
     end;
     FindClose(regBusqueda);
   end;
 end;
 //
 // Fin del procedimiento anidado:
 // Comienza "BuscarArchivos(...)"
 //
 begin
   Buscar(IncludeTrailingPathDelimiter(directorio));
 end;
 
 // Ejemplo de llamada a BuscarArchivos(...)
 //
 procedure TForm1.Button1Click(Sender: TObject);
 var
   lista: TStrings;
 begin
   lista := TStringList.Create;
   BuscarArchivos('C:\Archivos de programa\', '*.exe', faAnyFile, lista);
   ShowMessage(lista.Text);
   lista.Free;
 end;
Podrías probarlo y, si te ofrece resultados positivos, adaptarlo para tus necesidades.

Por cierto, la función "FindFirstFile" se encuentra en la unidad "Windows".

Neftali [Germán.Estévez] 29-07-2005 10:01:24

Cita:

Empezado por rfernandez
...preguntar cual es la funcion FindFirstFile que propone Netfali ya que no la encuentro solo encuentro la FindFirst y FindNext.

Es una función de la API de windows; Además es la que utiliza FindFirst de Delphi en su implementación.
Bastaría con que la escribieras en una unit de Delphi, colocaras el cursor en medio y pulsaras F1 para que te apareciera la ayuda.

Lepe 29-07-2005 10:59:42

rfernandez si editas tu mensaje y en lugar de poner "php" entre corchetes pones "delphi", el codigo sería más legible.

Yo no le veo problemas al código, creo que más bien el nodo Padre "pare" quizás no tenga el valor correcto y por eso no lo añade.

Metele ShowMessage(Fit.Name) antes de cambiar el ImageIndex, por ejemplo, para ver si encuentra los archivos.

Un saludo

rfernandez 17-10-2005 01:19:32

Por fin y sin quererlo he encontrado el porque a veces me falla.
Bueno todo biene por un atributo que tienen las carpetas, el atributo es el A --> Atributo de archivo de almacenamiento.

Si este atributo esta activo en las carpertas el findfirst que hago lo ignora y pasa de la carpeta como si no estuviese, un poco extraño pero eso pasa.

Solución --> quitar con attrib de msdos este atributo.

Gracias a todos.


La franja horaria es GMT +2. Ahora son las 05:43:57.

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