¿Dónde están FindFirstFile y FindNextFile? ¿Cómo leo un directorio?

Linux provee las funciones opendir y readdir para consultar la información de un directorio (ver manpages). Estas funciones sirven para el mismo propósito que las viejas findfirst, findnext de DOS y sus modernas versiones de Windows: FindFirstFile y FindNextFile.

Sin embargo estas dos funciones de GNU/Linux no permiten el uso de wildcards (comodines), como *.jpg. Para eso se puede usar la función glob o fnmatch.

glob

La función glob construye y entrega una lista ordenada alfabéticamente de todos los archivos que correspondan a un wildcard especificado.

fnmatch

La función fnmatch permite acceder directamente al algoritmo de wildcards estándar usado en UNIX.

Es de notar que el shell ya provee un manejo de wildcards. En DOS (o Windows), cuando uno tipea pkzip hola.zip *.* la orden ejecutada recibe como parámetro, entre otras cosas, el *.* intacto. En Unix, el shell reconoce que es un wildcard y se fija en el disco la lista de archivos que corresponden con ese wildcard, y esa lista es enviada como parámetros al programa, un parámetro por cada archivo encontrado. Si no se encuentra ningún archivo ahí sí se envía el wildcard.

Es decir que normalmente alcanza con que un programa asuma que cada uno de los parámetros que recibe es un archivo a procesar, ya que el shell se encarga de lo demás. Esto hace necesario tomar la precaución de encerrar entre comillas a un nombre de archivo que contenga algún ?, * o [].

Si todos estos mecanismos de alto nivel no interesan, por ejemplo porque simplemente se quiere recorrer todos los archivos, se puede usar la anteriormente mencionada readdir. Su funcionamiento es el siguiente: Se abre el directorio con opendir, esta operación devuelve un puntero a DIR. Luego pasándole este parámetro a readdir, se van obteniendo todos los archivos (en algún orden arbitrario). Al terminar se debe cerrar el directorio llamando closedir sobre el puntero a DIR. Para más detalles consulte las páginas de manual de estas funciones. Note que puede ser útil combinar esta última forma de acceso al directorio con la función fnmatch, e ir probando lo que se obtiene contra un wildcard. Y algo más sobre esta función: A pesar de que por su nombre parece pensada sólo para archivos no hay razón por la que no se la pueda utilizar para cualquier caso en el que se quiera disponer de wildcards.


Página principal