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

Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
- - Dernière réponse : 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!
Afficher la suite 
A voir également:

2 réponses

Meilleure réponse
Messages postés
3799
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
14 novembre 2019
90
3
Merci
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]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Testé et approuvé!

Merci beaucoup
Commenter la réponse de cs_hakimus