Un problema que aparece de vez en cuando es la necesidad de buscar un fichero en un directorio o en los subdirectorios que pueda tener.
En gambas hay una orden rdir que es especialmente útil para esto y funciona de la siguiente forma:
rdir(path,mascara,objeto_a_buscar)
si yo busco archivos usare gb.file, si busco directorios será gb.directory, ..., etc. La lista completa de items a buscar está aquí
http://gambasdoc.org/help/comp/gb/stat/type?es
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.
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
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
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
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.
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
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 falta añadir algunas posibilidades respecto al nombre completo de un fichero
He probado y creo que funciona bien. Sugerencias, rectificaciones, errores o aclaraciones estoy a vuestra disposición.