Leer los nombres de archivo de un directorio

Me preguntaba si hay una manera fácil en C ++ para leer varios nombres de archivos de una carpeta que contiene muchos archivos. Todos son mapas de bits si alguien se está preguntando.

No sé mucho acerca de la progtwigción de Windows, así que esperaba que se pudiera hacer usando métodos simples de C ++.

Boost proporciona un basic_directory_iterator que proporciona un iterador de entrada conforme estándar de C ++ que accede a los contenidos de un directorio. Si puede usar Boost, este es al menos un código multiplataforma.

Creo que estás buscando FindFirstFile() y FindNextFile() .

Solo eché un rápido vistazo a mi directorio de fragmentos. Encontró esto:

 vector filenames; CStdString directoryPath("C:\\foo\\bar\\baz\\*"); WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(directoryPath, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { do { if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) filenames.push_back(FindFileData.cFileName); } while (FindNextFile(hFind, &FindFileData)); FindClose(hFind); } 

Esto le da un vector con todos los nombres de archivo en un directorio. Solo funciona en Windows, por supuesto.


João Augusto señaló en una respuesta :

No olvide verificar después de FindClose(hFind) para:

 DWORD dwError = GetLastError(); if (dwError != ERROR_NO_MORE_FILES) { // Error happened } 

Es especialmente importante si escanea en una red.

También puede usar las funciones POSIX opendir () y readdir (). Consulte esta página del manual que también tiene un excelente código de ejemplo.

Recomiendo que pueda usar las funciones nativas Win32 FindFirstFile() y FindNextFile() . Éstos le dan un control total sobre cómo busca archivos. Estas son simples API de C y no son difíciles de usar.

Otra ventaja es que los errores de Win32 no están ocultos o son más difíciles de obtener debido a la capa de biblioteca de C / C ++.

C ++ 17 incluye una forma estándar de lograr eso

http://en.cppreference.com/w/cpp/filesystem/directory_iterator

 #include  #include  #include  namespace fs = std::filesystem; int main() { fs::create_directories("sandbox/a/b"); std::ofstream("sandbox/file1.txt"); std::ofstream("sandbox/file2.txt"); for(auto& p: fs::directory_iterator("sandbox")) std::cout << p << '\n'; fs::remove_all("sandbox"); } 

Posible resultado:

 sandbox/a sandbox/file1.txt sandbox/file2.txt 

Otra alternativa es –

  1. system("dir | findstr \".bmp\" > temp.txt ");
  2. Ahora lea temp.txt línea por línea para obtener todos los nombres de archivo.

¿Por qué no usar glob() ?

 glob_t glob_result; glob("/foo/bar/*",GLOB_TILDE,NULL,&glob_result); for(unsigned int i=0;i