Vérifiez si un répertoire est vide en utilisant C sous Linux
Est-ce la bonne manière de vérifier si un répertoire est vide ou n'est pas en C? Est-il un moyen plus efficace de vérifier pour un répertoire vide, surtout si elle a 1000s de fichiers si ce n'est pas vide?
int isDirectoryEmpty(char *dirname) {
int n = 0;
struct dirent *d;
DIR *dir = opendir(dirname);
if (dir == NULL) //Not a directory or doesn't exist
return 1;
while ((d = readdir(dir)) != NULL) {
if(++n > 2)
break;
}
closedir(dir);
if (n <= 2) //Directory Empty
return 1;
else
return 0;
}
Si ses un répertoire vide, readdir
va s'arrêter après les entrées '.' et '..' et donc vide si n<=2
.
Si son vide ou n'existe pas, il doit retourner 1 sinon retourner 0
Mise à jour:
@c$ time ./isDirEmpty /fs/dir_with_1_file; time ./isDirEmpty /fs/dir_with_lots_of_files
0
real 0m0.007s
user 0m0.000s
sys 0m0.004s
0
real 0m0.016s
user 0m0.000s
sys 0m0.008s
Pourquoi faut-il prendre plus de temps pour vérifier si un répertoire avec beaucoup de fichiers comme par rapport à celui avec juste un fichier?
source d'informationauteur freethinker
Vous devez vous connecter pour publier un commentaire.
La façon dont vous avez écrit votre code, il n'a pas d'importance combien de fichiers qu'il a (vous
break
si n > 2). Si votre code est d'utiliser un maximum de 5 appels. Je ne pense pas qu'il y a moyen de (de façon portable) le rendre plus rapide.Peut-être que ce code pourrait vous aider:
Je vérifie si le dossier est vide à l'aide de la commande ls-A dossier 2>/dev/null | wc-l, de compter les fichiers dans le dossier, si elle renvoie zéro le dossier est vide sinon le dossier est non vide. Le WEXITSTATUS macro, renvoie le code de sortie de la commande exécutée.
Remarque: si le dossier n'existe pas, ou vous n'avez pas les autorisations correctes pour y accéder, ce programme doit imprimer "le dossier est vide".