2014-04-25 1 views
1

J'essaie de lire les répertoires récursivement et d'imprimer des métadonnées sur les fichiers. J'ai le programme de travail pour le répertoire unique. Mais pour les sous-répertoires, quand j'applique la méthode stat, les fichiers continuent à donner une erreur de tel fichier ou répertoire n'existe pas.La fonction stat ne fonctionne pas pour les sous-répertoires?

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

void scan(const char *dir) // process one directory 
{ 
    DIR *dp; 
    struct dirent *de; 
    struct stat sbuf; 

    dp = opendir(dir); 
if(dp == NULL) 
{ 
//  perror(dir); 
    printf("Cannot open directory %s\n",dir); 
    return; 
} 

while(1) 
{ 
    const char * d_name; 
    de = readdir(dp); 
    if(de == NULL) 
      break;//Empty Directory 

    d_name = de->d_name; 
    printf("d_name: %s\n",d_name); 
//  if(strcmp(d_name,"..") != 0 && strcmp(d_name,".") != 0) 
//    printf("%s/%s\n",dir,d_name);//Print File or Directory 


    if(stat(de->d_name, &sbuf)) 
    { 
    //  perror(de->d_name); 
      printf("Error in stat %s\n",de->d_name); 
      continue; 
    } 

if(S_ISDIR(sbuf.st_mode) && (strcmp(d_name,"..") != 0 && strcmp(d_name,".") != 0)) 
{ 
//  printf("d_name: %s\n",d_name); 
    printf("d\t"); 
} 
else 
    if (strcmp(d_name,"..") == 0 || strcmp(d_name,".") == 0) 
    { 
    //    printf("d_name: %s\n",d_name); 
    //    continue; 
    } 
else 
{ 
    //  printf("d_name tab: %s\n",d_name); 
    printf("\t"); 
} 

    if(strcmp(d_name,"..") != 0 && strcmp(d_name,".") != 0) 
     printf("%lu\t%s\n", (unsigned long) sbuf.st_size, de->d_name); 

     if(de->d_type == DT_DIR) 
     { 
      if(strcmp(d_name,"..") != 0 && strcmp(d_name,".") != 0) 
      { 
        char path[1024]; 
        snprintf(path,1024,"%s/%s",dir,d_name); 
        scan(path); 

      } 
    } 

} 

    closedir(dp); 
} 

int main(int argc, char *argv[]) 
{ 
    int i; 
    scan(argv[1]); 

    return 0; 
} 

Répondre

2

Vous avez oublié de préfixer votre dir à votre de->d_name quand stat ing. Vous êtes toujours dans votre répertoire d'origine, car vous n'avez pas chdir ailleurs.

+0

Mais je n'ai jamais ajouté pour le premier répertoire. – user3213348

+0

Techniquement, c'est faux aussi, mais si votre premier répertoire est le répertoire courant, vous pouvez vous en sortir. –

+0

Donc Par exemple si le répertoire était/home/usr et le fichier était file.c, je passerais /home/usr/file.c dans la stat? – user3213348

Questions connexes