Liste des fichiers normaux uniquement (sans répertoire) problème
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.
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.