2010-06-24 21 views
0

j'ai besoin pour générer un conteneur de noms de fichiers dans un répertoire en C++ et il doit être multi-plateforme compatible. Quelqu'un a recommandé d'utiliser la structure de données WIN32_FIND_DATA. Est-ce la meilleure option et si oui, comment l'implémenterais-je?Créer un conteneur C++ qui contiennent les noms de fichiers dans un répertoire

L'utilisateur ne passe pas les noms de fichiers, mais la fonction C++ recherche automatiquement le répertoire et créer un conteneur de noms de fichiers. Je ne sais pas comment lire les noms de fichiers comme ça non plus. Je me concentre également sur les normes, donc <dirent.h> n'est pas une solution idéale parce que ce n'est pas la norme ISO C même si c'est un en-tête dans la bibliothèque C POSIX.

+1

Ni la norme C++ ni C ont quoi que ce soit sur les répertoires. Vous devrez utiliser une autre norme, comme POSIX, pour les gérer. –

Répondre

3

Je devine WIN32_FIND_DATA est pas votre meilleur pari pour la plate-forme cross, mais il y a probablement des bibliothèques pour aider à fournir sur linux.

Pensez à utiliser boost filesystem pour vider les fichiers dans un std::vector.

Quelque chose comme ça (adapté de here):

void show_files(const path & directory) 
{ 
    if(!exists(directory)) return; 

    directory_iterator end ; 
    for(directory_iterator iter(directory) ; iter != end ; ++iter) 
    if (is_directory(*iter)) continue; // skip directories 
    cout << "File: " << iter->native_file_string() << "\n" ; 
    } 
} 
+0

Pourriez-vous fournir un exemple de code en utilisant boost s'il vous plaît? – Elpezmuerto

+0

@Elpezmuerto: fait. – Stephen

+0

'boost :: filesystem' est fortement recommandé: il a été accepté par le comité des normes C++ dans le cadre de TR2 il sera finalement intégré à la plupart des compilateurs (sous' std :: TR2 :: sys'). – Nate

0

Um, je ne pense pas que quoi que ce soit avec Win32 est multiplateforme. Si vous avez juste besoin de stocker des noms de répertoire, ne pouvez-vous pas simplement utiliser un tableau, ou un vecteur?

0

Les moyens multiplateformes de la liste du contenu d'un répertoire sont:

D'autre part, presque WIN32_FIND_DATA est certainement pas portables sur différentes plates-formes (du nom de jugement).

+0

ne fait pas partie de la norme C; C'est un standard POSIX. – MSalters

+0

Vous avez raison. Edité en conséquence. – stakx

0

J'utiliser Boost.FileSystem. Non testé:

#include "boost/filesystem.hpp" 
#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <vector> 

namespace bf = boost::filesystem; 
typedef std::vector<bf::path> path_container; 

path_container enumerate_files(const bf::path& pDirectory) 
{ 
    path_container result; 

    if (!bf::exists(pDirectory)) 
     return result; 

    bf::directory_iterator iter(pDirectory); 
    bf::directory_iterator last; 

    for (; iter != last; ++iter) 
     if (bf::is_regular_file(iter->status())) 
      result.push_back(iter->path()); 

    return result; 
} 

int main(void) 
{ 
    path_container c = enumerate_files("./"); 

    std::copy(c.begin(), c.end(), 
     std::ostream_iterator<bf::path>(std::cout, "\n")); 
}