2013-02-03 3 views
0

J'écris un programme en C++ qui va traiter un grand nombre (en milliers) d'images PPM toutes stockées dans le même répertoire. Cependant, j'ai d'abord besoin de lire dans les valeurs de pixels. Est-ce leur fonction intégrée dans l'espace de noms standard ou une bibliothèque que je pourrais importer qui me permettrait de lire tous les fichiers un à la fois sans supposer que je connais déjà le nom du fichier en utilisant une sorte de structure en boucle? Dans le cas où cela fait une différence, j'écris le programme sur un Mac.Comment lire dans un répertoire de fichiers

+5

La bibliothèque standard n'a aucune notion de "système de fichiers" pour le moment. Vous devrez utiliser une solution spécifique à la plate-forme (ou Boost.Filesystem). –

+0

Voir pertinent: http://stackoverflow.com/questions/7377596/directory-recursion/7377707#7377707 – sehe

Répondre

1

Afin d'éviter d'inclure boost::filesystem et les dépendances nécessaires, je fini par mettre en œuvre cette fonction:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <stdexcept> 

//include headers required for directory traversal 
#if defined(_WIN32) 
    //disable useless stuff before adding windows.h 
    #define WIN32_LEAN_AND_MEAN 
    #include <windows.h> 
#else 
    #include "dirent.h" 
#endif 


/** 
Traverses the provided directory (non-recursively) and extracts the absolute paths to all the files in it. 

Doesn't support non-ASCII file names. 

@param directory the absolute path to the directory 
@return a vector of file names (including extension) 
*/ 
std::vector<std::string> Filesystem::GetFilesInDirectory(const std::string &directory) 
{ 
    std::vector<std::string> output; 

#if defined(_WIN32) 

    //select all files 
    std::string tempDirectory = directory + "*"; 

    //initialize the WIN32_FIND_DATA structure 
    WIN32_FIND_DATA directoryHandle = {0}; 

    //set the directory 
    std::wstring wideString = std::wstring(tempDirectory.begin(), tempDirectory.end()); 
    LPCWSTR directoryPath = wideString.c_str(); 

    //iterate over all files 
    HANDLE handle = FindFirstFile(directoryPath, &directoryHandle); 
    while(INVALID_HANDLE_VALUE != handle) 
    { 
     //skip non-files 
     if (!(directoryHandle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
     { 
      //convert from WCHAR to std::string 
      size_t size = wcslen(directoryHandle.cFileName); 
      std::vector<char> buffer; 
      buffer.resize(2 * size + 2); 
      size_t convertedCharacters = 0; 
      wcstombs_s(&convertedCharacters, buffer.data(), 2 * size + 2, directoryHandle.cFileName, _TRUNCATE); 
      //trim the null characters (ASCII characters won't fill the vector, since they require fewer bytes) 
      //convertedCharacters includes the null character, which we want to discard 
      std::string file(buffer.begin(), buffer.begin() + convertedCharacters - 1); 

      //add the absolute file path 
      output.emplace_back(file); 
     } 

     if(false == FindNextFile(handle, &directoryHandle)) break; 
    } 

    //close the handle 
    FindClose(handle); 

#else 

    DIR *directoryHandle = opendir(directory.c_str()); 
    if (NULL != directoryHandle) 
    { 
     dirent *entry = readdir(directoryHandle); 
     while (NULL != entry) 
     { 
      //skip directories and select only files (hopefully) 
      //if ((DT_DIR != entry->d_type) && (DT_UNKNOWN == entry->d_type)) 
      if (DT_REG == entry->d_type) 
      { 
       output.emplace_back(entry->d_name); 
      } 

      //go to next entry 
      entry = readdir(directoryHandle); 
     } 
     closedir(directoryHandle); 
    } 

#endif 

    return output; 
} 

Je ne suis pas très fier de ce qui précède unflexible/la plupart du temps le code inutile/dépendant de la plateforme et je certainement optez pour BOOST si possible. En passant, il n'est pas testé sur un MAC, alors s'il vous plaît faites le moi savoir si cela fait l'affaire.

+0

Eh bien, j'ai juste copié et collé votre code et avec un ajustement mineur, je l'ai fait fonctionner! Je vous remercie d'avoir posté votre code, c'était très utile. Merci! – lxdr

+0

De rien! :) –

Questions connexes