2010-11-01 2 views
1

J'ai un programme très simple ici, mais il semble retourner une "vraie" valeur à la requête S_ISDIR() même lorsque l'entrée du répertoire n'est pas un répertoire. Quelqu'un peut-il m'aider? J'utilise QNX RTOS NeurtionEn ce qui concerne la vérification de fichier ou de répertoire

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

int main(int argc, char *argv[]) { 
    DIR *dir; 
    struct dirent *entry; 
    struct stat eStat; 
    char *root; 
    int i; 

    root = argv[1]; 

    while((entry = readdir(dir)) != NULL) { 
     lstat(entry->d_name, &eStat); 
     if(S_ISDIR(eStat.st_mode)) 
      printf("found directory %s\n", entry->d_name); 
     else 
      printf("not a dir\n"); 
    } 

    return 0; 
} 
sortie

exemple:

found directory . 
found directory .. 
found directory NCURSES-Programming-HOWTO-html.tar.gz 
found directory ncurses_programs 
found directory ncurses.html 

Les informations suivantes peuvent être utiles. lstat pour le fichier échoue avec errno mis à 2. Je ne sais pas pourquoi, quelqu'un peut le savoir.

Répondre

4

Juste une supposition; puisque vous ne vérifiez pas une erreur après votre appel lstat, le tampon eStat pourrait contenir le résultat du dernier appel réussi. Essayez de vérifier si lstat renvoie -1. Readdir() sous Linux est fondamentalement différent, donc je ne peux pas tester complètement sur mon système. Voir les exemples de programmes au link text et link text. Modification de l'exemple de code lstat, cela semble fonctionner pour moi:


#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
    { 
    int ecode = 0; 
    int n; 
    struct stat sbuf; 

    for(n = 1; n < argc; ++n) { 
     if(lstat(argv[n], &sbuf) == -1) { 
     perror(argv[n]); 
     ecode++; 

     } else if(S_ISDIR(sbuf.st_mode)) { 
     printf("%s is a dir\n", argv[n]); 

     } else { 
     printf("%s is not a dir\n", argv[n]); 
     } 
    } 
} 

Je ne sais pas si cela aide tout. Notez que l'exemple de code readdir() utilise opendir() comme indiqué par schot. Mais je ne peux pas expliquer pourquoi votre readdir() semble fonctionner malgré tout.

+0

oui, vous avez raison lstat retournant l'échec pour le fichier, je ne sais pas pourquoi il retourne l'échec, peut-on m'aider – Venkata

+1

si (lstat (entrée-> nom_d, & eStat) == -1) perror (entrée -> d_name); –

1

Mon compilateur dit: « avertissement: « dir » est utilisé dans cette fonction non initialisée » Vous pouvez ajouter dir = opendir(root); après l'initialisation root. Et n'oubliez pas d'ajouter une vérification d'erreur.

Je doute que cela cause votre problème, jcomeau_ictx a probablement raison. Si lstat renvoie -1, il définit errno sur une valeur qui indique le type d'erreur. Regardez sa page man et la page de manuel pour strerror

0

Même si cette question a été posée il ya longtemps, et je l'ai trouvé parce que this quesion. mais les réponses ici n'ont pas vraiment résolu le problème, j'ai donc décidé d'afficher la réponse que j'ai écrite sur another post, de sorte que si quelqu'un avait le même problème et a utilisé google pour trouver cette page, il y a une réponse claire.

La vraie raison de S_ISDIR ne fonctionne pas comme prévu est dp->d_name contient uniquement le nom du fichier, vous devez passer le chemin complet du fichier à lstat().