Elencare solo i file regolari (senza directory) problema
Domanda
Sai perché alcuni file non sono elencati da questo programma, anche se sono " regolari "?:
#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;
}
Dopo aver eseguito questo programma, ottengo questo:
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
Come puoi vedere, il programma vede solo due file. Ma ogni file è regolare e c'è solo una cartella.
Ecco una copia del comando 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
Vorrei solo elencare il nome di ciascun file, ma senza directory. Lavoro su Mac OS X, ma non credo che questo potrebbe essere il motivo del problema.
Soluzione
Sembra che la funzione stat
non funzioni per alcuni file, quindi la struttura info
non viene aggiornata e contiene ancora i dati da " .. "
. Sostituisci quella riga con:
if (stat(file->d_name, &info))
{
printf("error: stat(%s): %s\n", file->d_name, strerror(errno));
continue;
}
..e vedrai il perché.
Altri suggerimenti
Una volta ho dovuto elencare tutti i file yml nella directory comprese le sottodirectory. Era su Win XP:
system (" dir C: \ Path \ To \ File \ *. yml / B / S > > list.txt ");
e quindi analizzerei list.txt per ottenere tutto loro. Una riga era un file. Facile, ma non portatile. Anche quello è stato qualche tempo fa - ora forse proverei a potenziare.
EDIT: Questa risposta non riguarda il codice, ma:
In realtà vorrei solo elencare il nome di ciascun file, ma senza directory.
Se avesse adottato il mio stesso approccio, avrebbe risolto il suo problema.