2010-10-28 8 views
1

Ok j'ai quelque chose comme ceci:Comment récupérer les noms de fichiers et de sous-répertoires à partir d'un répertoire dans C?

struct dirent *dp; 
DIR *dir; 
char fullname[MAXPATHLEN]; 
char** tmp_paths = argv[1]; //Not the exact code but you get the idea. 

... 

while ((dp = readdir(dir)) != NULL) 
{ 
    struct stat stat_buffer; 

    sprintf(fullname, "%s/%s", *tmp_paths, dp->d_name); 

    if (stat(fullname, &stat_buffer) != 0) 
     perror(opts.programname); 

    /* Processing files */ 
    if (S_ISDIR(stat_buffer.st_mode)) 
    { 
     nSubdirs++; 
     DIRECTORYINFO* subd = malloc(BUFSIZ); 
    } 

    /* Processing subdirs */ 
    if (S_ISREG(stat_buffer.st_mode)) 
    { 
     nFiles++; 
     FILEINFO *f = malloc(BUFSIZ); 
    } 
} 

Comment puis-je sur la lecture dans les noms de fichiers et les noms de sous-répertoire dans ma propre structure DirectoryInfo et FILEINFO? J'ai traversé stat.h et n'ai rien trouvé d'utile.

+0

sont une caractéristique du système d'exploitation et ne fait pas partie de C. Vous devez spécifier la plate-forme. –

Répondre

1

Dans le monde UNIX, le nom ne fait pas partie du fichier, donc stat(2) ne peut pas récupérer des informations à ce sujet. Mais dans votre code que vous avez le nom dp->d_name, de sorte que vous pouvez copier cette chaîne dans votre propre structure de données. Cela devrait être assez simple.

Si ce n'est pas votre problème je ne comprenais pas la question.

+0

Yup qui fonctionne merci. C'est juste que j'avais l'impression que d_name ne fonctionne que pour les répertoires. – jon2512chua

+1

Il est très fréquent pour les types 'struct' sous UNIX que les champs sont préfixées avec un commun * quelque chose * et un trait de soulignement. Par exemple 'struct dirent' a' d_ * ',' struct stat 'a' st_ * ',' struct time' a 'tm_ *'. –

0

Jetez un oeil à this question et ses réponses. Vous voulez probablement utiliser dirent->d_name.

0

Glob est votre ami

Le glob() fonction recherche pour tous le motif correspondant de noms de fichiers selon les règles utilisées par le shell

/* Sample Code */ 
#include <glob.h>  
glob_t data; 
glob("*", 0, NULL, &data); /* Here "*" says to match all files of the current dir */ 
for(int i=0; i<data.gl_pathc; i++) 
{ 
    /* Printing all the path names,Just for illustration */ 
    printf("%s\n", data.gl_pathv[i]); 
} 
/* To split into DIRINFO and FILEINFO, stat(2) should be made use of */ 
globfree(&data); /* free the data structure */ 

Pour obtenir plus de détails vous peut toujours utiliser l'homme unix page

répertoires homme glob

Questions connexes