Lister automatiquement les fichiers d'un repertoire : problème de portabilité?

Résolu
cs_hakimus Messages postés 25 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 8 juillet 2010 - 30 juin 2010 à 12:06
cs_hakimus Messages postés 25 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 8 juillet 2010 - 1 juil. 2010 à 10:28
Bonjour à tous,

Je cherche à récupérer la liste de tous les fichiers présents dans un répertoire, en C++. De ce que j'ai lû jusqu'à présent, le code diffère selon l'environnement :

// WIN32
#include <stdio.h>
#include <windows.h>

int main(void)
{
    WIN32_FIND_DATA File;
    HANDLE hSearch;
    
    hSearch = FindFirstFile("*.*", &File);
    if (hSearch != INVALID_HANDLE_VALUE)
    {
        do {
            printf("%s\n", File.cFileName);
        } while (FindNextFile(hSearch, &File));
        
        FindClose(hSearch);
    }
    
    return 0;
}


//POSIX
#include <stdio.h>
#include <dirent.h>
 
int main(void)
{
    DIR * rep = opendir(".");
    
    if (rep != NULL)
    {
        struct dirent * ent;
        
        while ((ent = readdir(rep)) != NULL)
        {
            printf("%s\n", ent->d_name);
        }
        
        closedir(rep);
    }
     
    return 0;
}


J'aimerais donc savoir comment faire pour intégrer ces deux portions de code à mon application et faire en sorte de détecter l'environnement pour exécuter le bon code? J'ai pensé à des macros, mais je n'en ai encore jamais utilisé, donc si quelqu'un a un exemple sur la façon de faire?...

Ou, encore mieux, un code portable qui m'évite d'avoir à détecter l'environnement?

Merci d'avance!

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
30 juin 2010 à 14:08
Utilise boost, c'est portable :)
Ce que tu cherches à faire est dans boost::filesystem

Exemple (qui permet au choix de lister les fichiers avec ou sans se soucier des sous dossiers):
#include 
#include 
#include 
#include 

namespace fs = boost::filesystem;

void displaySpace(int nb)
{
  for (int i = 0; i < nb; ++i)
    std::cout << ' ';
}

void listDirectory(const fs::path& path,
   bool recursive,
   int depth = 0)
{
  if (!fs::exists(path))
    return;

  fs::directory_iterator end;
  for (fs::directory_iterator it(path); it != end; ++it)
  {
    displaySpace(depth);
    if (fs::is_directory(it->status()))
    {
      if (recursive)
listDirectory(it->path(), recursive, depth + 2);
      std::cout << it->path().filename() << "/" << std::endl;
    }
    else if (fs::is_regular_file(it->status()))
      std::cout << it->path().filename() << std::endl;
    else
      std::cout << it->path().filename() << " [other]" << std::endl;
  }
}

int main()
{
  listDirectory(".", false);
  listDirectory(".", true);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
cs_hakimus Messages postés 25 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 8 juillet 2010
1 juil. 2010 à 10:28
Testé et approuvé!

Merci beaucoup
0
Rejoignez-nous