Comparar todos los archivos en n directorios

Started by Danielo515, July 17, 2009, 11:50:12 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

Estoy, como siempre, utilizando bennu para programar esas pequeñas aplicaciones personales que pretendo hagan mi vida más fácil. Ando detrás de programar una que compare todos los archivos con todos los archivos en una serie de directorios, pero no se me ocurre como asegurarme de haber comparado todos con todos.
Imaginemos que tenemos 4 carpetas, cada una con x archivos, y quiero comparar el contenido de las cuatro carpetas. ¿cojo el primer directorio y lo comparo con todos los demás. Pero a la hora de implementarlo con la función glob, me surgen las dudas. ¿utilizo glob, y cuando llego al primer directorio que hago? si llamo a otro proceso que entre en el directorio y compare con las otras carpetas, la función glob se reinicia, así que ¿puede que me devolviera varias veces los mismos archivos no? Otra opción es sacar a un archivo todas las carpetas y luego tomar de ese archivo las carpetas a explorar y comparar, por ejemplo.
¿necesitaría una lista de archivos ya comparados?, quiero decir, para excluir, porque es evidente que la primera carpeta, una vez comparada con todas las demás, no es necesario compararla más veces.

Pero el verdadero problema me surge cuando dentro de una de las carpetas hay una subcarpeta ¿como garantizo que los archivos de esa subcarpeta se comparen también con todos? casi todas mis dudas provienen de que no se seguro como funciona glob, no tengo claro cuadno se reinicia, y si se puede llamar a distintos procesos para explorar n subcarpetas o si la funcion glob se reinicia o como va todo. Ya se que splinter me lo ha explicado en ya más de una ocasión, pero a veces hay cosas que me cuesta metermelas en el coco, lo siento.

Un saludo.

SplinterGU

en vez de glob, usa diropen, dirread, dirclose...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Ja ja ja ja, siempre que pregunto alguna cosa de estas acabo descubriendo alguna nueva función desconocida para mí. Muchas gracias splinter, voy a investigar el tema.

SplinterGU

;)

es nueva, revisa el diario de avances, que esta documentada.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Ja jaja,si porque no la encontraba por el wiki, a ver si por el foro la encuentro. Gracias.

Danielo515

Por lo visto las funciones que me dices se comportan igual que glob pero repartido en varias funciones. ¿que ventajas aportan? o que facilidades me darían frente a glob? Gracias

SplinterGU

la ventaja es que las podes usar de forma recursiva, ya que cada una es un handle diferente... o sea, que se pueden recorrer a la vez varios directorios sin que se resetee... ya que usas diferentes handles para cada directorio...
lo unico que comparten es el area de informacion... o sea, que luego de un dirread, tenes que leer el area de informacion...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

ah vale, es que eso no lo ponia en la docu y yo no soy muy bueno deduciendo comportamientox ;D

Por lo que veo, el diropen devuelve un handle, pero no recuerdo que en las funciones dirread y esas cosas me pusiera nada de que aceptara un int como handle, quizá no lo leí bien, voy a revisarlo ahora mismo. Por cierto, son funcionalidades dela versión rc1.0?

SplinterGU

Quote
int DIROPEN (STRING path)

Open a dir for read it, given a path with wildcards ('*' or '?' characters).
is ok returns handle id, if fail return 0.

Quote
int DIRCLOSE (INT handle)

Close a dir

Quote
string DIRREAD (INT handle)

Returns the first file that matches with the pattern passed in diropen.
In every next call, all matching files found until no more files exists. It then returns "".
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Gracias splinter, en efecto no lo había mirado bien. Ya me he hecho una idea de como funcionan y me estoy haciendo un programita que hace uso de estas nuevas funciones. Esta genial, muchas gracias por tu ayuda, como siempre, muy útil.

Drumpi

Hola a todos:

Siento el reflote, pero tiene que ver con el tema y es una duda que no me queda muy clara.
A ver, si no he entendido mal, DIRREAD funciona igual que GLOB, sólo que sin filtrar los ficheros del directorio abierto con DIROPEN: devuelve una string con el nombre del fichero y rellena FILEINFO con sus datos.
La ventaja es que permite varios "hilos" de consulta (se puede leer desde dos procesos distintos sin que uno le "quite" ficheros al otro) ¿no?

La cuestión es que, para "resetear" GLOB y que vuelva a empezar desde el principio se debe cambiar de directorio o de "cadena filtro". ¿Esto es igual con DIRREAD o se puede "resetear" (empezar de nuevo a devolver ficheros desde el principio) usando FRAME?

Intento hacer un navegador de directorios, pero quiero que al "cerrarlo" y volverlo a "abrir" (sin cerrar el programa) me vuelva a mostrar la lista de ficheros del último directorio consultado.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

no te entendi eso de "sin filtro"

pero evidentemente no lo probaste, cada apertura es independiente... si lo cerras lo cerras, si abris 10 con el mismo directorio y fitro, obtendras 10 navegaciones independientes...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

GLOB requiere una cadena de texto, y devolverá sólo los ficheros y directorios cuyos nombres coincidan con dicha cadena: eso es un filtro ;D

Cierto, no había caido: si cierras el directorio y lo vuelves a abrir, se "resetea" sólo ^^U Gracias.
Es que ya estoy habituado a GLOB, y se me hace raro el pasarme a otras funciones. Ten en cuenta que, hasta hace poco, no me planteaba el perder la compatibilidad hacia atrás. En este código estoy usando muchas características exclusivas de Bennu (más por pereza que por otra cosa ^^U) y muchas otras de nivel avanzado (cosas "raras" con punteros ;D).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)