Autor Tema: Un Directory Walker llamado dw.exe (by RedPic)  (Leído 2320 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *****
  • Mensajes: 5362
    • Picmania by Redraven
Un Directory Walker llamado dw.exe (by RedPic)
« en: 31 de Enero de 2009, 20:14:40 »
Me ha costado trabajo pero al final ha salido funcionando.   8)

Por necesidades del guión (es la excusa que las actrices recatadas ponían cuando debían aparecer desnudas en un film) por necesidades del guión, decía, tengo que recorrerme todo un árbol de directorios y subdirectorios extrayendo solo una serie o tipo de ficheros de texto para tratarlos y revisarlos separadamente, uno a uno.

Empecé con los dos primeros ficheros haciéndolo a mano y tardé un buen rato en hacerlo ... y la lista incluye varios cientos de ficheros. Ante tal enormidad, podía tardar meses en repasar todos y cada uno de esos ficheros,  y sabiendo que no soy mal programador me decidí por hacerme un "repasador" automático que realice lo que a mi me costaría sangre, sudor y lágrimas.

Antes de desarrollar las interioridades de la labor que tengo que realizar, como paso previo, necesitaba una pequeña herramienta que fuese capaz de seleccionar todos y cada uno de los ficheros de un tipo determinado y hacer una lista con ellos, su path + file_name + file_extension, para poder tratarlos posteriormente uno a uno.

Este trabajo previo es el que os presento aquí.

Se trata de un pequeño programa que dado un directorio inicial y un file_extension rellena un TListBox con todos los ficheros de ese tipo que se encuentren en ese directorio y si está marcado un Checkbox lista también todos los subdirectorios que aquél tenga. Accesoriamente también rellena otro TListbox con los nombre de aquellos directorios que va recorriendo.

La función principal, llamada Execute, es llamada de forma recursiva cada vez que se encuentra un directorio dentro del que está tratando en ese momento. Este es el quid del programa y la parte sencilla a la par que elegante de la que me siento orgulloso de mostraros.

Esta es la función a la que me refiero, el resto es lo justo para poder llamarla:
Código: Pascal
  1. procedure TFrmMain.Execute(filespec: string; mask: string;  recursive: boolean);
  2. var
  3.   sr : TSearchRec;
  4.   path,tmp : string;
  5.   FFileAttrs: TFileAttribs;
  6. begin
  7.      FFileAttrs := [];
  8.      filespec := filespec + chr(92) + mask;
  9.      path := ExtractFilePath(filespec);
  10.  
  11.      { 1ª fase : Añade los ficheros del directorio }
  12.      if FindFirst( filespec , AttrToInt(fFileAttrs), sr) = 0 then
  13.      begin
  14.           { Añado el primer fichero }
  15.           ListResults.Items.Add(path+sr.FindData.cFileName);
  16.           { Añado el resto de ficheros }
  17.           while FindNext(sr) = 0 do
  18.           begin
  19.                ListResults.Items.Add(path+sr.FindData.cFileName);
  20.           end;
  21.           FindClose(sr);
  22.      end;
  23.  
  24.      { 2ª fase : Trata los directorios si hay recursividad }
  25.      if recursive and (FindFirst( path+'*.*' , Sysutils.faDirectory, sr) = 0) then
  26.      begin
  27.           { Re-trato el primer subdirectorio }
  28.           if recursive and ((sr.Attr and sysutils.faDirectory)<>0) and (sr.Name<>'.')  and  (sr.Name<>'..') then
  29.           begin
  30.              tmp := path + sr.FindData.cFileName;
  31.              ListDirs.Items.Add(tmp);
  32.              Execute(tmp , mask,recursive);
  33.           end;
  34.           { Re-trato el resto de subdirectorios }
  35.           while FindNext(sr) = 0 do
  36.           begin
  37.                if recursive and ((sr.Attr and sysutils.faDirectory)<>0) and (sr.Name<>'.') and  (sr.Name<>'..') then
  38.                begin
  39.                   tmp := path + sr.Name;
  40.                   ListDirs.Items.Add(tmp);
  41.                   Execute(tmp , mask ,recursive);
  42.                end;
  43.           end;
  44.           FindClose(sr);
  45.      end;
  46. end;
  47.  


Una imagen del programa funcionando es ésta, en ella se puede ver cómo he extraído todos los ficheros de tipo PHP que hay en el directorio (sed pacientes si tarda en cargar) :


Bueno y por último aquí tenéis el Proyecto dw.dpr para Delphi 6 Enterprise por si os sirve para algo: descargar

Que os aproveche, y hasta otro día.  :mrgreen:
« Última modificación: 01 de Febrero de 2009, 17:58:57 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado eto

  • PIC12
  • **
  • Mensajes: 64
    • Programacion y Electronica
Re: Un Directory Walker llamado dw.exe (by RedPic)
« Respuesta #1 en: 01 de Febrero de 2009, 14:14:44 »
Muy buen resultado, lo acabo de probar y todo bien  :-) , solo una sugerencia, me parece que te sería aun más util si en la lista de la izquierda solo mostrara las carpetas que contienen archivos con la extencion que buscas.
No borro mis errores, al contrario los mantengo a la vista para no cometerlos otra vez.

Mi Web

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *****
  • Mensajes: 5362
    • Picmania by Redraven
Re: Un Directory Walker llamado dw.exe (by RedPic)
« Respuesta #2 en: 01 de Febrero de 2009, 18:00:12 »
Si, es una posibilidad interesante.

Si cualquiera quiere modificarlo o ampliarlo abajo del todo tiene el enlace con los fuentes.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania