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

Signaler
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
-
cs_hakimus
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
-
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

Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
93
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]
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010

Testé et approuvé!

Merci beaucoup