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 buenas 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.

Video: Como Verificar Existencia de un Directorio y Listar Contenido en C++

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 la biblioteca estándar de C ++ 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.

Video: 27 - Tutorial de C++ en español - mkdir crear directorios

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

    Video: Windows 10 - Crear listado de archivos y directorios fácil y rápido

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

  2. Comprobar los resultados de _findfirst ().

    Si _findfirst () devuelto -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 ha de devolver un número que se utiliza en las posteriores llamadas a las diversas funciones de encontrar.

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

    Video: C++ tutorial 18. Leer y escribir en un archivo fstream

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

    Si _findnext () devoluciones -1, que no encontró más Files- se 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 volvió de _findfirst ().

    todo haya terminado.

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

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

#incluir # include # include # include using namespace std-Chop cadena (string &str) {res 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, ") -}} res- retorno DumpEntry vacío (_finddata_t &datos) {createtime cadena (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 ("../*.*", &de datos) -Si (ff! = -1) {int res = 0, mientras (res! = -1) {DumpEntry (datos) -res = _findnext (ff, &datos) -} _ FindClose (FF) -}} volver 0-

Se puede ver cómo principal()sigue los pasos que acabamos de exponer. Y para cada una de las estructuras de datos, la función de llamada DumpEntry () se utilizó. 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 Dic 15 19:40:00 20130 [.] Dom Dic 15 19:40:00 20130 [..] Dom Dic 15 19:40:00 20130 [deleteDirectory] Dom Dic 15 19:40:00 20130 [GetDirectoryContents] sol Dic 15 19:40:00 20130 [MaKeDIRectory] Dom Dic 15 19:40:00 20130 [renombrar ficheros]

Tenga en cuenta cómo, en el DumpEntry () función, que está probando si el elemento es un directorio. Este es otro viejo (pero fiable) forma de programa: Comprobar la presencia de un poco pequeña particular en el medio de la attrib miembro de la estructura, como este:

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

Y, por último, se dará cuenta de una función extraña llamada incluido Picar(). Esto se debe a la ctime () función - de otra forma útil para formatear el tiempo - añade un retorno de carro (o nueva línea) Al final de la cadena que crea. Así que picar 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.

Artículos Relacionados