Faire un ls en C

Résolu/Fermé
Jayjaynam Messages postés 2 Date d'inscription mardi 8 avril 2014 Statut Membre Dernière intervention 8 avril 2014 - 8 avril 2014 à 14:36
Jayjaynam Messages postés 2 Date d'inscription mardi 8 avril 2014 Statut Membre Dernière intervention 8 avril 2014 - 8 avril 2014 à 15:29
Bonjour, j'essaye de reproduire le fonctionnement de ls en C mais je rencontre un problème. Voici mon code :


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>

int main(int argc, char **argv){

DIR* rep = NULL;
struct dirent* fichierLu = NULL;
if((rep = opendir("/home/jayjay/projetres")) == NULL){
perror("Le fichier n'a pas pu être ouvert");
exit(1);
}

while((fichierLu = readdir(rep)) != NULL){
if(strcmp(fichierLu->d_name, ".") != 0 && strcmp(fichierLu->d_name, "..") != 0 && strcmp(fichierLu->d_name, ".*") != 0){
printf("%s\n", fichierLu->d_name);
}
}
}

Le problème est à la ligne où je compare des chaines. La 3ème comparaison est fausse et je le sais mais en fait, j'aimerais juste comparer ma chaine de caractère à .* pour enlever tous les fichiers cachés de la liste que va m'afficher le ls. C'est sur ce point que j'aimerais que vous m'aidiez parce que je ne sais absolument pas comment je vais pouvoir faire ça.

Merci d'avance pour vos réponses.
Jayjaynam

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/04/2014 à 14:58
Salut Jayjaynam,

https://man7.org/linux/man-pages/man3/readdir.3.html

Comme la structure
dirent
contient
d_name[256]
, qui est une chaîne C, il suffit que tu vérifies que le premier caractère du tableau d_name n'est pas un point.

Tu fais cela simplement comme ceci :

if ( (strcmp(fichierLu->d_name, "..") != 0) && 
     (fichierLu->d_name[0] != '.') ) {


Cela permet aussi de retirer le test
(strcmp(fichierLu->d_name, ".") != 0)
car ce cas est de toutes façons couvert par le test d'inégalité du premier caractère avec le point.


Dal
2