Faire un ls en C

Résolu
Jayjaynam Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
Jayjaynam Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
Jayjaynam Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   1
 
Ah oui effectivement, j'avais complètement oublié la base de la base ... Grâce à toi, ça marche bien et je vais donc pouvoir continuer à m'entrainer.
Le sujet peut donc être clôt.

Merci beaucoup et bonne journée.
Jayjaynam.
1