web-dev-qa-db-fra.com

Comment obtenir la liste des fichiers avec une extension spécifique dans un dossier donné?

Je veux obtenir les noms de fichiers de tous les fichiers qui ont une extension spécifique dans un dossier donné (et récursivement, ses sous-dossiers). Autrement dit, le nom de fichier (et l'extension), pas le chemin d'accès complet au fichier. C'est incroyablement simple dans des langages comme Python, mais je ne connais pas les constructions pour cela en C++. Comment ceci peut être fait?

42
Jim
#define BOOST_FILESYSTEM_VERSION 3
#define BOOST_FILESYSTEM_NO_DEPRECATED 
#include <boost/filesystem.hpp>

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<fs::path>& 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;

    }

}
50
Gigi

Sur Windows, vous faites quelque chose comme ceci:

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 );
   }
}

Sur Posix, comme Linux ou 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 );
   }
}
17
Rafael Baptista

un code C++ 17

#include <fstream>
#include <iostream>
#include <experimental/filesystem>
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;
}
14
cck

Obtenez la liste des fichiers et traitez chaque fichier, parcourez-les et stockez-les dans un dossier différent

void getFilesList(string filePath,string extension, vector<string> & 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);
        }
    }
}

UTILISATION: vous pouvez utiliser comme ceci charger tous les fichiers du dossier et les parcourir un par un

String optfileName ="";        
String inputFolderPath =""; 
String extension = "*.jpg*";
getFilesList(inputFolderPath,extension,filesPaths);
vector<string>::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++;
}
4
sam

Vous ne dites pas sur quel OS vous êtes, mais il y a plusieurs options.

Comme les commentateurs l'ont mentionné, boost :: filesystem fonctionnera si vous pouvez utiliser boost.

D'autres options sont

2
crashmstr