Question

Savez-vous pourquoi certains fichiers ne sont pas répertoriés par ce programme, même s'ils sont "normaux"?:

#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>

int main(void) {
  DIR *dh = opendir("./"); // directory handle
  struct dirent *file; // a 'directory entity' AKA file    
  struct stat info; // info about the file.
  while (file = readdir(dh)) {
    stat(file->d_name, &info);
    printf("note: file->d_name => %s\n", file->d_name);
    printf("note: info.st_mode => %i\n", info.st_mode);
    if (S_ISREG(info.st_mode))
      printf("REGULAR FILE FOUND! %s\n", file->d_name);
  }
  closedir(dh);

  return 0;
}

Après avoir exécuté ce programme, je reçois ceci:

note: file->d_name => .
note: info.st_mode => 16877
note: file->d_name => ..
note: info.st_mode => 16832
note: file->d_name => .DS_Store
note: info.st_mode => 16832
note: file->d_name => ef efeff
note: info.st_mode => 16832
note: file->d_name => ffffff
note: info.st_mode => 16832
note: file->d_name => ffffff - copie
note: info.st_mode => 16832
note: file->d_name => folder
note: info.st_mode => 16832
note: file->d_name => printiie.tt
note: info.st_mode => 16832
note: file->d_name => test.c
note: info.st_mode => 33188
REGULAR FILE FOUND! test.c
note: file->d_name => z
note: info.st_mode => 33188
REGULAR FILE FOUND! z

Comme vous pouvez le constater, le programme ne voit que deux fichiers. Mais chaque fichier est normal et il n’ya qu’un seul dossier.

Voici un extrait de la commande shell: $ ls -lai :

total 64
2421444 drwxr-xr-x  10 denis  staff   340 27 oct 22:19 .
2416789 drwxr-xr-x@ 28 denis  staff   952 27 oct 22:20 ..
2423204 -rw-r--r--@  1 denis  staff  6148 27 oct 21:41 .DS_Store
2423206 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ef efeff
2423183 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ffffff
2423216 -rwxr-xr-x@  1 denis  staff   895 27 oct 19:57 ffffff - copie
2423436 drwxr-xr-x   2 denis  staff    68 27 oct 21:57 folder
2423180 -rw-r--r--@  1 denis  staff    38 27 oct 21:32 printiie.tt
2423682 -rw-r--r--@  1 denis  staff   895 27 oct 19:57 test.c
2423208 -rwxr-xr-x@  1 denis  staff    34 27 oct 21:39 z

Je voudrais juste énumérer le nom de chaque fichier, mais sans répertoires. Je travaille sur Mac OS X, mais je ne pense pas que cela puisse être la cause du problème.

Était-ce utile?

La solution

Il semble que la fonction stat échoue pour certains fichiers. Par conséquent, la structure info n'est pas mise à jour et contient toujours les données de "..." . Remplacez cette ligne par:

if (stat(file->d_name, &info))
{
    printf("error: stat(%s): %s\n", file->d_name, strerror(errno));
    continue;
}

.. et vous verrez pourquoi.

Autres conseils

Je devais une fois lister tous les fichiers yml du répertoire, y compris les sous-répertoires. C'était sur Win XP: system ("dir C: \ Path \ To \ File \ *. yml / B / S" > list.txt ")) et j'analyserais list.txt pour obtenir tous les les eux. Une ligne était un fichier. Facile, mais pas portable. C'était aussi il y a quelque temps - maintenant, j'essaierais peut-être de stimuler.

EDIT: Cette réponse ne concerne pas le code, mais:

  

En fait, je voudrais juste énumérer le nom de chaque fichier, mais sans répertoires.

S'il adoptait la même approche que moi, son problème serait résolu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top