2009-12-20 8 views
2

Est-il possible en C++ de compter le nombre de fichiers avec une extension donnée dans un répertoire?compte le nombre de fichiers avec une extension donnée dans un répertoire - C++?

J'écris un programme où il serait bien de faire quelque chose comme ça (pseudo-code):

if (file_extension == ".foo") 
    num_files++; 
for (int i = 0; i < num_files; i++) 
    // do something 

De toute évidence, ce programme est beaucoup plus complexe, mais cela devrait vous donner l'idée générale de ce que j'essaie de faire.

Si ce n'est pas possible, dites-le moi.

Merci!

+0

Quel système d'exploitation? –

+0

Système d'exploitation UNIX – Alex

Répondre

5

Il n'y a rien dans le C ou C++ normes eux-mêmes sur la gestion du répertoire, mais à peu près tout OS digne de ce nom aura une telle bête, un exemple étant les findfirst/findnext fonctions ou readdir.

La façon dont vous le feriez est une simple boucle sur ces fonctions, en vérifiant la fin des chaînes retournées pour l'extension que vous voulez.

Quelque chose comme:

char *fspec = findfirst("/tmp"); 
while (fspec != NULL) { 
    int len = strlen (fspec); 
    if (len >= 4) { 
     if (strcmp (".foo", fspec + len - 4) == 0) { 
      printf ("%s\n", fspec); 
     } 
    } 
    fspec = findnext(); 
} 

Comme indiqué, les fonctions réelles que vous utiliserez pour parcourir le répertoire sont OS spécifiques. Pour UNIX, il serait presque certainement l'utilisation de opendir, readdir et closedir. Ce code est un bon point de départ pour que:

#include <dirent.h> 

int len; 
struct dirent *pDirent; 
DIR *pDir; 

pDir = opendir("/tmp"); 
if (pDir != NULL) { 
    while ((pDirent = readdir(pDir)) != NULL) { 
     len = strlen (pDirent->d_name); 
     if (len >= 4) { 
      if (strcmp (".foo", &(pDirent->d_name[len - 4])) == 0) { 
       printf ("%s\n", pDirent->d_name); 
      } 
     } 
    } 
    closedir (pDir); 
} 
+0

Dans les deux cas ci-dessus. Une boucle de (;;) ne serait-elle pas plus propre? –

+0

Question de goût ou de style, je pense, @ Martin. J'ai tendance à utiliser des boucles pour des choses simples (surtout le genre "pour i = 1 à 10") et à utiliser pour des boucles plus compliquées. Mais dans les deux cas, pas vraiment pertinent à la question à portée de main. – paxdiablo

6

Ce type de fonctionnalité est spécifique au système d'exploitation, il n'y a donc pas de méthode portable standard pour cela. Cependant, en utilisant Boost's Filesystem library vous pouvez le faire, et beaucoup plus d'opérations liées au système de fichiers de manière portable.

1

D'abord pour quoi OS écrivez-vous?

  • S'il est Windows puis recherchez FindFirstFile et FindNextFile dans MSDN.
  • Si vous cherchez le code pour les systèmes POSIX, lisez man pour opendir et readdir ou readdir_r.
  • Pour la plate-forme croisée, je suggère d'utiliser la bibliothèque Boost.Filesystem.