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

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

Votre réponse

2 réponses

Meilleure réponse
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
164
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 111 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
Dernière intervention
8 juillet 2010
0
Merci
Testé et approuvé!

Merci beaucoup
Commenter la réponse de cs_hakimus

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.