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;
}
Mais je n'ai jamais ajouté pour le premier répertoire. – user3213348
Techniquement, c'est faux aussi, mais si votre premier répertoire est le répertoire courant, vous pouvez vous en sortir. –
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