2009-03-04 24 views
14

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

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

+1

Véase también [¿Cómo puedo obtener la lista de archivos en un directorio usando C o C++] (http://stackoverflow.com/questions/612097/cómo puedo obtener la lista de archivos en un directorio usando c). –

Respuesta

18

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

4

Te recomiendo que puedas utilizar 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 la biblioteca de C/C++.

6

También podría usar las funciones POSIX opendir() y readdir(). Ver this manual page que también tiene un excelente código de ejemplo.

9

Acabo de echar un rápido vistazo a mi directorio de fragmentos. Encontrado esto:

vector<CStdString> 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 archivos en un directorio. Solo funciona en Windows, por supuesto.


João Augusto señaló en un answer:

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

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

es especialmente importante si el escaneado en una red.

1

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

¿Por qué no utilizar glob()?

glob_t glob_result; 
glob("/foo/bar/*",GLOB_TILDE,NULL,&glob_result); 
for(unsigned int i=0;i<glob_result.gl_pathc;++i){ 
    cout << glob_result.gl_pathv[i] << endl; 
} 
+0

Olvidó comprobar que glob() devuelve cero, así como liberar el glob_result asignado con globfree(). – orbitcowboy

2

C++ 17 incluye una norma manera de lograr ese

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

#include <fstream> 
#include <iostream> 
#include <filesystem> 
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"); 
} 

salida posible:

sandbox/a 
sandbox/file1.txt 
sandbox/file2.txt 
Cuestiones relacionadas