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.
en vez de glob, usa diropen, dirread, dirclose...
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.
;)
es nueva, revisa el diario de avances, que esta documentada.
Ja jaja,si porque no la encontraba por el wiki, a ver si por el foro la encuentro. Gracias.
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
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...
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?
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 "".
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.
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.
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...
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).