Página 1 de 1

Búsqueda Recursiva De Ficheros (Gambas)

Publicado: 27 Sep 2010, 15:15
por Kodeinfect

Código: Seleccionar todo

Dim Ficheros as string[], MiPath as string, Fichero as string

MiPath=user.home
Ficheros=rdir(MiPath,"{^]*",gb.file)
for each Fichero in Ficheros
   listbox.add fichero
next
Con esto conseguiremos un listbox en el que estén todos los archivos NO OCULTOS que se encuentren en el home y en sus subdirectorios.

Ahora bien ahí no están sus rutas ¿Que pasa si necesito también las rutas de esos archivos?

Así que he elaborado una pequeña rutina recursiva que explora cada directorio, guarda el path y el archivo de todo lo que encuentra y devuelve una tabla con todo el contenido:

Código: Seleccionar todo

Dim Ficheros as string[] ' lugar donde quedarán todos los ficheros de la ruta especificada incluyendo subdirectorios
Dim Fichero as string ' variable para cada fichero concreto de la lista anterior
Ficheros = buscar(newpath)

  FOR EACH Fichero in ficheros 'añadir a un supuesto listbox todo lo encontrado
    Lista.add(fichero)
  NEXT 
Ahora el código de buscar que es quien buscar los archivos y los guarda en una tabla con su path correspondiente y devuelve el array obtenido:

Código: Seleccionar todo

FUNCTION buscar(MiPath AS String)  AS String[]
  DIM Directorio AS String, Ficheros AS String[]
  DIM NewPath AS String, NuevosFicheros AS String[], Contador as integer
  
  ficheros = Dir(MiPath, "[^.]*", gb.file)  'ficheros en directorio actual se meten en array ficheros
  
  FOR Contador = 0 TO ficheros.Max            ' añadir ruta a ficheros
    ficheros[Contador] = MiPath &/ ficheros[Contador]
  NEXT
  
  'Ahora examinar subdirectorios que pueda haber en MiPath
  FOR EACH directorio IN Dir(MiPath, "[^.]*", gb.Directory) 'para cada directorio en directorio actual que no sea oculto
    newpath = Mipath &/ directorio 'obtener nuevo path del subdirectorio
    NuevosFicheros = buscar(newpath) 'buscar ficheros en el subdirectorio. Quedan en un array NuevosFicheros
    Ficheros = agregardatos(Fichero, NuevosFicheros) 'Agregar los nuevos ficheros al arary donde quedan todos
  NEXT
  RETURN ficheros
END
Por último una pequeña rutina que sirve para sumar dos arrays. Esta rutina lo que hace es recibir una Array A y otra B. Aumenta el Tamaño de A para que quepan todos los elementos de B y luego en el nuevo espacio mete los elementos de B:

Código: Seleccionar todo

FUNCTION agregardatos(A AS String[], B AS String[]) AS String[]
  DIM Posicion AS Integer, Contador AS Integer
    Posicion = A.Length ' Tamaño actual de A
    A.Resize(Posicion + B.Length) 'Ampliar tamaño de A al tamaño que tenía mas el tamaño de B
    FOR contador = posicion TO A.Max 'para cada elemento nuevo y actualmente vacío
      A[contador] = B[contador - posicion] 'meter valor de B
    NEXT
  RETURN A
END
A esto faltaría añadir algunas posibilidades respecto al nombre completo de un fichero:

Código: Seleccionar todo

  PRINT file.BaseName(Lista[5].text) '---> el nombre+extension del fichero
  PRINT file.Dir(Lista[5].text) '---> el path del fichero
  PRINT file.Ext(Lista[5].text) '---> la extensión del fichero
  PRINT file.Name(Lista[5].text) '---> el nombre sin extensión del fichero