2012-06-21 15 views
36

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?¿Cómo obtener la lista de archivos con una extensión específica en una carpeta determinada?

+7

[ 'impulso :: filesystem'] (http://www.boost.org/doc/libs/1_41_0/libs/filesystem/doc/index.htm) es bueno con los archivos. – chris

+0

Escribir C++ después de que Python tiene ganas de escribir en un lenguaje ensamblador después de C++ :) En lo que respecta al C++ estándar, esta es una tarea sorprendentemente intensiva en cuanto a los códigos. En segundo lugar sugiero utilizar 'boost :: filesystem'. – dasblinkenlight

+0

Impresionante, gracias por la referencia. Voy a verificar eso. – Jim

Respuesta

47
#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; 

    } 

} 
+0

@ namar0x0309 He aplicado su edición, eso es correcto. – Gigi

+2

allí, esta es la respuesta portátil. –

+2

Lo único que no funcionó para mí es el 'y', lo reemplacé por '&&'. El resto es excelente. +1 –

16

En las ventanas que hacer 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 o 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); 
    } 
} 
+0

Sus soluciones encontrarían el archivo en el patrón, "foo.txt.exe". No consideraría que tener una extensión .txt. –

+0

En Windows, ¿dónde está configurando el valor de "gIgnoreHidden". ¿Es una bandera? – hshantanu

+0

sí - es un booleano global en el ejemplo. Pero realmente puedes hacer cualquier cosa aquí, como pasarlo como otro argumento para listFiles. –

3

obtener la lista de archivos y proceso de cada archivo y lazo a través ellos y almacenar en otra carpeta

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

USO: se puede utilizar como esta carga todos los archivos de la carpeta y el bucle a través de uno en uno

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++; 
} 
1

un código 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; 
} 
Cuestiones relacionadas