2010-05-10 10 views
8

¿Cómo obtengo la cantidad total de archivos en un directorio utilizando la biblioteca estándar de C++? Se agradece cualquier ayuda.Recuento de archivos en un directorio usando C++

+1

El funcionamiento del directorio está relacionado con el sistema operativo en el que se encuentra, desafortunadamente. Así que publique con qué SO está intentando, entonces tal vez podamos ayudarlo mejor. – Daniel

+0

Código de plataforma cruzada para trabajar tanto en Windows como en Linux. Estoy usando mingw, gcc y msvc junto con la biblioteca wxWidgets, usando boost pero sin vincular a sus bibliotecas, solo incluyendo encabezados. fstat y _stat funciones que tenemos en #include . para obtener detalles del archivo. ¿Tenemos un soporte similar para obtener detalles del directorio? – harik

Respuesta

11

No puede. Lo más cerca que podrá obtener es usar algo como Boost.Filesystem

+6

Después de lo cual es trivial: 'int count = std :: difference (directory_iterator (dir_path), directory_iterator());' – MSalters

+4

@MSalters, no puedo encontrar ninguna referencia a 'std :: difference'. ¿Estás seguro de que no quisiste decir 'std :: distance'? Además, necesitarás un 'static_cast ' para forzar 'directory_iterator :: difference_type' a' int'. –

+0

Estoy intentando evitar el enlace a las bibliotecas de Boost y usar solo encabezados para los algoritmos. – harik

2

. Necesitará utilizar una API o marco nativo.

13

Si no excluye la biblioteca estándar C, básicamente siempre disponible, puede usar esa. Porque de todos modos está disponible en todas partes, a diferencia del boost, ¡es una opción muy útil!

Se da un ejemplo here.

Y aquí:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int main (void) 
{ 
    DIR *dp; 
    int i; 
    struct dirent *ep;  
    dp = opendir ("./"); 

    if (dp != NULL) 
    { 
    while (ep = readdir (dp)) 
     i++; 

    (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    printf("There's %d files in the current directory.\n", i); 

    return 0; 
} 

Y, por supuesto

> $ ls -a | wc -l 
138 
> $ ./count 
There's 138 files in the current directory. 

Esto no es C++ en absoluto, sino que está disponible en la mayoría, si no todos, los sistemas operativos, y trabajarán en C++ independientemente

ACTUALIZACIÓN: Corregiré mi declaración anterior acerca de que esto forma parte de la biblioteca estándar C - no lo es. Pero puede llevar este concepto a otros sistemas operativos, ya que todos tienen su forma de manejar los archivos sin tener que recurrir a bibliotecas adicionales.

+0

-1: la biblioteca estándar de C tampoco proporciona ninguna manera de enumerar un directorio. –

+5

Eso es un voto estúpido. Por supuesto, puedes contar archivos usando la libra estándar C.Tome el ejemplo que incluí en mi publicación - en lugar de llamar "puts ..." dentro del tiempo usado para iterar sobre cada archivo, simplemente haga "i ++" y declare un "int i" en algún lugar de arriba. Por supuesto, no existe la función "directory_get_file_count", pero ese no es el punto. El punto es que PUEDES usarlo para obtener el resultado deseado, es decir, la cantidad de archivos en una carpeta. Diablos, déjame editar mi respuesta original con una respuesta alimentada con cuchara, sec – LukeN

+1

-1, 'readdir' es POSIX no estándar C. – MSalters

1

Si están bien nombrados, ordenados y tienen la misma extensión, simplemente puede contarlos con la biblioteca estándar de C++.

asumir los nombres de los archivos son como "img_0.jpg..img_10000.jpg..img_n.jpg", Sólo comprobar si están en la carpeta o no.

int Trainer::fileCounter(string dir, string prefix, string extension) 
{ 
    int returnedCount = 0; 
    int possibleMax = 5000000; //some number you can expect. 

    for (int istarter = 0; istarter < possibleMax; istarter++){ 
     string fileName = ""; 
     fileName.append(dir); 
     fileName.append(prefix); 
     fileName.append(to_string(istarter)); 
     fileName.append(extension); 
     bool status = FileExistenceCheck(fileName); 

     returnedCount = istarter; 

     if (!status) 
      break; 
    } 

    return returnedCount; 
} 

bool Trainer::FileExistenceCheck(const std::string& name) { 
    struct stat buffer; 
    return (stat(name.c_str(), &buffer) == 0); 
} 
6

Una cuestión de edad, pero ya que aparece primero en la búsqueda de Google, pensé que añadir mi respuesta, ya que tenía una necesidad de algo así.

int findNumberOfFilesInDirectory(std::string& path) 
{ 
    int counter = 0; 
    WIN32_FIND_DATA ffd; 
    HANDLE hFind = INVALID_HANDLE_VALUE; 

    // Start iterating over the files in the path directory. 
    hFind = ::FindFirstFileA (path.c_str(), &ffd); 
    if (hFind != INVALID_HANDLE_VALUE) 
    { 
     do // Managed to locate and create an handle to that folder. 
     { 
      counter++; 
     } while (::FindNextFile(hFind, &ffd) == TRUE); 
     ::FindClose(hFind); 
    } else { 
     printf("Failed to find path: %s", path.c_str()); 
    } 

    return counter; 
} 
Cuestiones relacionadas