Comment ignorer les fichiers cachés avec opendir et readdir dans la bibliothèque C

Voici un code simple:

DIR* pd = opendir(xxxx); struct dirent *cur; while (cur = readdir(pd)) puts(cur->d_name); 

Ce que je reçois est un peu désordonné: y compris les points ( . ), Les points ( .. ) et les noms de fichiers se terminant par ~ .

Je veux faire exactement la même chose que la commande ls . Comment puis-je résoudre ce problème, s’il vous plaît?

C’est normal. Si vous faites ls -a (qui montre tous les fichiers, ls -A affichera tous les fichiers sauf pour . Et .. ), vous verrez la même sortie.

. est un lien faisant référence au répertoire dans foo/bar/. il se trouve: foo/bar/. est la même chose est foo/bar .

.. est un lien faisant référence au répertoire parent du répertoire dans foo/bar/.. il se trouve: foo/bar/.. est la même chose que foo .

Tout autre fichier commençant par . sont des fichiers cachés (par convention, ils ne sont pas vraiment appliqués, c’est différent de Windows, où il existe un véritable atsortingbut caché officiel). Les fichiers se terminant par ~ sont probablement des fichiers de sauvegarde créés par votre éditeur de texte (encore une fois, ceci est une convention, cela pourrait vraiment être n’importe quoi).

Si vous ne souhaitez pas afficher ces types de fichiers, vous devez les rechercher explicitement et les ignorer.

Éliminer les fichiers cachés:

 DIR* pd = opendir(xxxx); struct dirent *cur; while (cur = readdir(pd)) { if (cur->d_name[0] != '.') { puts(cur->d_name); } } 

Éliminer les fichiers cachés et les fichiers se terminant par “~”:

 DIR* pd = opendir(xxxx); struct dirent *cur; while (cur = readdir(pd)) { if (cur->d_name[0] != '.' && cur->d_name[strlen(cur->d_name)-1] != '~') { puts(cur->d_name); } } 

Collez un if (cur->d_name[0] != '.') Avant de traiter le nom.

Le standard de fichier caché UNIX est le premier point, qui . et .. correspondent également.

Le trailing ~ est la norme pour les fichiers de sauvegarde. Il est un peu plus compliqué de les ignorer, mais un processeur multi-gigahertz peut le gérer. Utilisez quelque chose comme if (cur->d_name[strlen(cur->d_name)-1] == '~')

Ce comportement est exactement comme ce que fait ls -a . Si vous voulez un filtrage, vous devrez le faire après coup.