¿Cómo obtener una lista de archivos con una extensión específica en una carpeta determinada?

Quiero obtener los nombres de archivo de todos los archivos que tienen una extensión específica en una carpeta determinada (y recursivamente, sus subcarpetas). Es decir, el nombre del archivo (y la extensión), no la ruta completa del archivo. Esto es increíblemente simple en lenguajes como Python, pero no estoy familiarizado con los constructos para esto en C ++. ¿Cómo puede hacerse esto?

 #define BOOST_FILESYSTEM_VERSION 3 #define BOOST_FILESYSTEM_NO_DEPRECATED #include  namespace fs = ::boost::filesystem; // return the filenames of all files that have the specified extension // in the specified directory and all subdirectories void get_all(const fs::path& root, const string& ext, vector& ret) { if(!fs::exists(root) || !fs::is_directory(root)) return; fs::recursive_directory_iterator it(root); fs::recursive_directory_iterator endit; while(it != endit) { if(fs::is_regular_file(*it) && it->path().extension() == ext) ret.push_back(it->path().filename()); ++it; } } 

En Windows, haces algo como esto:

 void listFiles( const char* path ) { struct _finddata_t dirFile; long hFile; if (( hFile = _findfirst( path, &dirFile )) != -1 ) { do { if ( !strcmp( dirFile.name, "." )) continue; if ( !strcmp( dirFile.name, ".." )) continue; if ( gIgnoreHidden ) { if ( dirFile.attrib & _A_HIDDEN ) continue; if ( dirFile.name[0] == '.' ) continue; } // dirFile.name is the name of the file. Do whatever string comparison // you want here. Something like: if ( strstr( dirFile.name, ".txt" )) printf( "found a .txt file: %s", dirFile.name ); } while ( _findnext( hFile, &dirFile ) == 0 ); _findclose( hFile ); } } 

En Posix, como Linux u OsX:

 void listFiles( const char* path ) { DIR* dirFile = opendir( path ); if ( dirFile ) { struct dirent* hFile; errno = 0; while (( hFile = readdir( dirFile )) != NULL ) { if ( !strcmp( hFile->d_name, "." )) continue; if ( !strcmp( hFile->d_name, ".." )) continue; // in linux hidden files all start with '.' if ( gIgnoreHidden && ( hFile->d_name[0] == '.' )) continue; // dirFile.name is the name of the file. Do whatever string comparison // you want here. Something like: if ( strstr( hFile->d_name, ".txt" )) printf( "found an .txt file: %s", hFile->d_name ); } closedir( dirFile ); } } 

un código C ++ 17

 #include  #include  #include  namespace fs = std::experimental::filesystem; int main() { std::string path("/your/dir/"); std::string ext(".sample"); for(auto& p: fs::recursive_directory_iterator(path) { if(p.path().extension() == ext()) std::cout < < p << '\n'; } return 0; } 

Obtenga una lista de archivos y procese cada archivo, bucleelos y almacénelos en una carpeta diferente

 void getFilesList(string filePath,string extension, vector & returnFileName) { WIN32_FIND_DATA fileInfo; HANDLE hFind; string fullPath = filePath + extension; hFind = FindFirstFile(fullPath.c_str(), &fileInfo); if (hFind != INVALID_HANDLE_VALUE){ returnFileName.push_back(filePath+fileInfo.cFileName); while (FindNextFile(hFind, &fileInfo) != 0){ returnFileName.push_back(filePath+fileInfo.cFileName); } } } 

USO: puede usar de esta manera cargar todos los archivos de la carpeta y recorrerlos uno a uno

 String optfileName =""; String inputFolderPath =""; String extension = "*.jpg*"; getFilesList(inputFolderPath,extension,filesPaths); vector::const_iterator it = filesPaths.begin(); while( it != filesPaths.end()) { frame = imread(*it);//read file names //doyourwork here ( frame ); sprintf(buf, "%s/Out/%d.jpg", optfileName.c_str(),it->c_str()); imwrite(buf,frame); it++; }