Quelle est la façon correcte d'utiliser la stat() pour tester si un DIRENT est un répertoire ou un fichier?
Je vais avoir quelques problèmes avec le " si(S_IFDIR(stbuf.st_mode))' à la ligne. Est-ce le bon moyen de tester un répertoire répéter? La fonction pour l'instant semble faire bon pour 1 ou 2 boucles, puis échoue et la segmentation des défauts.
J'ai essayé ce qui suit, et sans doute plus que l'état.
S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)
J'ai inclus l'ensemble de la fonction, parce que je suis concerné, le problème est peut être ailleurs.
void getFolderContents(char *source, int temp){
struct stat stbuf;
int isDir;
dirPnt = opendir(source);
if(dirPnt != NULL){
while(entry = readdir(dirPnt)){
char *c = entry->d_name;
if(strcmp(entry->d_name, cwd) == 0 || strcmp(entry->d_name, parent) == 0){
}
else{
stat(entry->d_name, &stbuf);
printf("%i %i ", S_IFMT, stbuf.st_mode);
if(S_IFDIR(stbuf.st_mode)){ //Test DIR or file
printf("DIR: %s\n", entry->d_name);
getFolderContents(entry->d_name, 0);
}
printf("FILE: %s\n", entry->d_name);
}
}
closedir(dirPnt);
}
Pour la réponse correcte look here.
OriginalL'auteur cheesysam | 2009-10-09
Vous devez vous connecter pour publier un commentaire.
Oui, c'est correct. Mais puisque vous ne changez jamais dans le répertoire, vous ne le trouverez pas.
Envisager le répertoire suivant de la hiérarchie:
Votre code de balayage de son répertoire en cours, et de trouver "une". Il permettra de déterminer qu'il s'agit d'un répertoire, et l'appel lui-même de manière récursive, et ouvrir "un" pour la lecture. Les travaux de cette. Cette analyse permettra de trouver un répertoire nommé "b", mais en essayant de l'ouvrir en utilisant le nom de l'entrée seulement, sera un échec, car le chemin est maintenant "a/b".
Je recommande de changer dans le répertoire (avec
chdir()
) avant de l'ouvrir. Cela signifie que vous pouvez simplementopendir(".")
. Stocker de l'ancien chemin, etchdir()
de nouveau lorsque recursing que le niveau est effectuée (pas avant de faire un appel récursif à aller plus loin).Lorsque la structure d'entrée est testé et trouvé c'est un répertoire, je suis d'appeler à nouveau la fonction de manière récursive qui ouvrira alors que le chemin d'accès au répertoire.
Voulez-vous dire alors que je dois inclure le chemin d'accès relatif au répertoire j'ai commencé avec?
Votre processus a exactement un "répertoire courant". Tous les non-absolu du fichier opérations sont effectuées à l'aide de qui que que la base. Si vous n'fonctions opendir() sur "a", puis les fonctions opendir sur "b", il n'y a rien qui fait que dire "a/b". Vous avez besoin d'un chdir() pour effectuer la numérisation de répertoire courant, puis les fonctions opendir(".") et de manière récursive.
OriginalL'auteur unwind
Où est l'entrée ? est-il une variable locale ?
Je ne vois pas pourquoi il aurait erreur de segmentation, mais peut-être vous devriez en faire une variable locale.
Un exemple où il va vous mordre est ici :
Le printf va imprimer le mauvais nom, de sorte que vous devriez ajouter un autre ici.
Le même est vrai avec dirpnt. Quand vous sortez de getFolderContents à l'intérieur de la boucle while,
vous retrouvez l'appel readdir fermé dirpoint, ce qui devrait vous sortir de la boucle.
Mais comme l'a déclaré bahbar :
Vous ne pouvez pas répéter et le stockage temporaire de variable dans une variable globale
vous ne pouvez pas répéter et le stockage temporaire de valeurs dans un mondial. Mettre à la fois l'entrée et dirPnt comme des variables locales
Grâce Bahbar je pense que c'était pour me retient beaucoup. Il fonctionne beaucoup mieux maintenant mais seulement va à l'analyse d'un dossier de profondeur.
OriginalL'auteur shodanex