Faire un "ls" mais en C [Résolu]

Signaler
Messages postés
50
Date d'inscription
jeudi 17 novembre 2005
Statut
Membre
Dernière intervention
7 janvier 2009
-
Messages postés
50
Date d'inscription
jeudi 17 novembre 2005
Statut
Membre
Dernière intervention
7 janvier 2009
-
bonjour,

Je voudrais ecrire quelques lignes de codes pour remplacer la commande ls sous linux, pour me passer de la commande
system("ls"); qui ne renvoi que 0 ou 1. Je pourrai ecrire system("ls > titi); et lire le résultat dans titi. Mais mon intention est d'utiliser >>>>

int fd;
char chemin [BUFSIZ] = "/usr/local/qui/va/bien";
char nom     [BUFSIZ] = "";
if ((fd=open(chemin,O_RDONLY,0)==-1{
   printf("erreur");
} else {
   while(read(fd,(char *) &nom,BUFSIZ)>0) {
      printf("%s",nom);
    }
}

En fait read(fd,(char *) &nom,BUFSIZ) me renvoi toujours -1 et je ne fais jamais printf. L'ouverture avec open est bonne puisque le descripteur me renoi dans mon cas 8 et pas -1.

J'ai même utiliser la structure >>>>
 strcut direct [ino_t d_ino, char d_name[BUZSIZ]};
struct direct tamp_rep;
et la lecture read(fd,(char *) & tamp_rep,BUFSIZ) me renvoi encore -1.
 
J'ai essayer pas mal d'autre chause sur le mode d'écritue avec ou sans (char *) avec ou sans & rien y fait.

Merci d'avance!!

Timy94</gras>

9 réponses

Messages postés
547
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
7 octobre 2007
1
Bonjour,


En gros si j'ai bien compris tu voudrais parcourir l'arborescence d'un
répertoire et afficher des informations sur les fichiers ou répertoires
parcourrus.

Si c'est bien cela va voir le post que j'ai écrit ici
(http://www.siteduzero.com/forum-83-47155-373643.html#r373643), il
devrais répondre à une partie de ton problème.

Cordialement

Fred Cailleau-Lepetit
Soft In The Box
Forum wxWidgets en français
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
Salut,

il y a les : opendir, readir, closedir
Messages postés
58
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2006

Salut,

Si j'ai bien compris tu ton "/usr/local/qui/va/bien" est un répertoire et donc tu peut pas te servir de la fonction read, regarde la valeur de errno je parie qu'elle est égale à EISDIR.

Si j'ai mal compris faudrai que tu donne la valeur de errno ca peut aider
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012

Salut,

je ne suis pas sûr d'avoir compris ce que tu veux.
ce que j'ai compris : tu veux récupérer le résultat de "ls" pour pouvoir l'exploiter dans un programme.
Si c'est ça : essaye d'utiliser "execl" (regarde "exec" dans le manuel de linux), mais il faudra que tu fasse un "fork" et une redirection de la sortie standard ("dup"), je ne me rappel plus si on peut rediriger la sortie standard sur un char**, mais sur un fichier oui :)

A+
Messages postés
50
Date d'inscription
jeudi 17 novembre 2005
Statut
Membre
Dernière intervention
7 janvier 2009

Bonjour,
En fait tu as raison l'erreur est l'erreur 21 "C'est un repertore".
Mais j'utilise ma bible >>>Le langage C nirme ANSI de Kernighan et Ritchie. Et au paragraphe 8.6 Le listage des fichiers d'un répertoire y est décrit la fonction lire_repertoire(...) { }, et il utlise le read comme ceci.
while (read (pr->fd, (char*), &tamp_rep, sizeof(tamp_rep)) etc..... On voit que le read est utilisé pour la lecture du réptoire.

En UNIX un répertoire est un simple fichier
Timy94</gras>
Messages postés
58
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2006

Salut,
je sais qu'un répertoire est un fichier mais il est souvent interprété de manière différente par pas mal d'outils.

Le langage C nirme ANSI>> j'ai jamais lu. T'as essayé de recopier leur source et de l'essayer? t'as peut être loupé une étape parce que s'il est prévue que read renvoie ce type d'erreur c'est qu'il doit y avoir une méthode particulière pour traiter un répertoire. Je sais pas de quand date ton bouquin mais ils utilisent peut-être pas la même version de read que toi
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
18
 Essaye :  while(read(fd,(char *) nom,BUFSIZ)>0)  // (sans le &)
Car char[..] c'est deja un char * .
&nom = char **
++
Messages postés
50
Date d'inscription
jeudi 17 novembre 2005
Statut
Membre
Dernière intervention
7 janvier 2009

J'ai utilisé dirent.h, opendir readdir closedir et ce marche. Merci beaucoup.

Timy94</gras>
Messages postés
50
Date d'inscription
jeudi 17 novembre 2005
Statut
Membre
Dernière intervention
7 janvier 2009

J'ai utilisé dirent.h, opendir readdir closedir et ce marche. Merci beaucoup.
Timy94</gras>