Cómo obtener el contenido de un directorio en c ++

Si quiere leer el contenido de un directorio, que realmente va en contra de lo que está disponible en el idioma estándar de C ++. Sin embargo, las almas clase de las grandes bibliotecas de C ++ (es decir, la gente que escribió la mayor parte de las bibliotecas disponibles en C ++) generalmente construidas en algunas funciones útiles para obtener el contenido de un directorio.

Un directorio por lo general contiene varios archivos, así como otros directorios. Obtener una lista de contenidos está involucrado. Usted no sólo se llama a una función y obtener algo a cambio.

Por supuesto, si el estándar de C ++ Library incluye una función para la obtención de información, es probable que sea una clase de plantilla que contiene el contenido del directorio. Por desgracia, la biblioteca no lo soporta. En su lugar, usted tiene que subir a través de algunas funciones. Así es como funciona.

  1. Llamada _findfirst (), pasándolo a una ruta de acceso y un patrón para los archivos cuyos nombres desea encontrar.

    Por ejemplo, pasar *. * para obtener todos los archivos en el directorio, o *.TXT para obtener todos los archivos que terminan en .TXT. También pasar un puntero a una _finddata_t estructura.

  2. Revise los resultados de _findfirst ().

    Si _findfirst () regresado -1, no encontró ningún archivo (lo que significa que haya terminado). De lo contrario, llena el _finddata_t estructura con el primer archivo se encuentra, y devolverá un número que se utiliza en las posteriores llamadas a las distintas funciones de búsqueda.

  3. Mira el _finddata_t estructura para determinar el nombre del archivo y otra información, como crear la fecha, la última fecha de acceso, y el tamaño.

  4. Llamada _findnext () y pasarlo a los siguientes valores: el número de regresar de _findfirst () y la dirección de una _finddata_t estructura

    Si _findnext () devoluciones -1, no encontró más files- usted puede ir al paso 5. De lo contrario mirar el _finddata_t estructura para obtener la información para el siguiente archivo encontrado. A continuación, repita el paso 4.

  5. Llamada _findclose () y pasarlo el número regresó de _findfirst ().

    Ya está todo terminado.

Youch! Eso es un poco extraño, pero es las cosas que solía hacer en los viejos tiempos de programación, antes de que las lenguas dominantes desarrollaron características tales civilizados como clases y objetos.

los GetDirectoryContents ejemplo muestra cómo implementar este elegante proceso, pasado de moda.

#include #include #include #include using namespace std cuerdas Chop (cadena str) {res de cadena = str-int len ​​= str.length () - si (str [len - 1] == ' r') {res.replace (len - 1, 1, "") -} len = str.length () - si (str [len - 1] == ' n') {res.replace (len - 1, 1, "") -} return res-} void DumpEntry (_finddata_t datos) {createtime string (ctime (data.time_create)) - cout lt; lt; Chop (createtime) lt; lt; " t" -cout lt; lt; data.size lt; lt; " t" -si ((data.attrib _A_SUBDIR) == _A_SUBDIR) {Cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-} else {cout lt; lt; data.name lt; lt; endl -}} int main () {_ datos int finddata_t ff = _findfirst ("../*.*", datos), si (ff! = -1) {int res = 0, mientras (res! = -1) {DumpEntry (datos) -res = _findnext (ff, datos) -} _ FindClose (FF) -} volver 0-}

Usted puede ver cómo main ()sigue los pasos que acabamos de esbozar. Y para cada una de las estructuras de datos, la función llamada DumpEntry () fue usado. los DumpEntry () función imprime la información sobre el archivo. Esto es lo que debería ver cuando se ejecuta la aplicación (la entrada del directorio actual, la entrada de directorio de los padres, y los cuatro directorios que contienen otros ejemplos):

Dom 15 de diciembre 19:40:00 20130 [.] Dom 15 de diciembre 19:40:00 20130 [..] dom 15 de diciembre 19:40:00 20130 [deleteDirectory] dom 15 de diciembre 19:40:00 20130 [GetDirectoryContents] Sun 15 de diciembre 19:40:00 20130 [MaKeDIRectory] dom 15 de diciembre 19:40:00 20130 [renombrar ficheros]

Nota cómo, en el DumpEntry () función, usted está poniendo a prueba si el elemento es un directorio. Este es otro viejo (pero confiable) manera de programa: Comprobar la presencia de un pequeño poco particular en el medio de la attrib miembro de la estructura, así:

si (data.attrib _A_SUBDIR == _A_SUBDIR) {Cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-}

Y, por último, te darás cuenta de una función extraña incluido llama Picar(). Eso es porque el ctime () función - de otra manera útil para formatear el tiempo - añade un retorno de carro (o nueva línea) Al final de la cadena que crea. Así que cortar que fuera. De lo contrario la información después de la fecha tiene que empezar en la siguiente línea de texto, que no se desea.




» » » » Cómo obtener el contenido de un directorio en c ++