PDA

Ver la Versión Completa : recorrido por directoris buscando archivos


rfernandez
28-07-2005, 13:53:34
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,


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.


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:


(*

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