Lister les fichiers d un repertoire [C] - C - Programmation
Marsh Posté le 22-04-2005 à 16:30:41
sbucci2 a écrit : Il y a t il une methode simple de lister les fichiers situer dans un repertoire en les triant par date. |
Faut le faire soi même. Rien de standard C. opendir()/readdir() est POSIX.1. Pour le tri, qsort() est standard.
Citation : Je suis en C sous bash. |
Ca veut dire que ton C est interprété ?
Marsh Posté le 22-04-2005 à 16:34:26
je vais regarder les fonctions que tu m as donné.
Je compile normalement avec mon make et ensuite j execute.
Marsh Posté le 22-04-2005 à 16:36:03
J'ajouterais que tu auras surement besoin de la fonction "stat()" pour avoir accès à la date du fichier, pour pouvoir ensuite le trier.
Marsh Posté le 22-04-2005 à 16:42:59
Avec ca tes fichiers sont triés et affichés du plus ancien au plus recent
Code :
|
Marsh Posté le 22-04-2005 à 16:47:52
que dois je utiliser pour changer la methode de tri ?
Encore merci
Marsh Posté le 22-04-2005 à 16:50:09
Rak111 a écrit : Avec ca tes fichiers sont triés et affichés du plus ancien au plus recent |
Par quel miracle ?
Pas de tableau, pas de tri... C'est de la magie ?
Marsh Posté le 22-04-2005 à 18:11:04
sbucci2 a écrit : en tout cas, c est qu il fait !!! |
Non.
|
|
Marsh Posté le 22-04-2005 à 21:15:32
Le cadre d'en bas représente les fichiers une fois triés ?
apparament ta modif marche pas très bien... le readdir() lit les fichiers du plus ancien au plus recent. Qu'est ce que tu veux y faire de plus ? c'est bien la réponse à la question qui était posée non ?
Marsh Posté le 22-04-2005 à 21:28:09
Rak111 a écrit : Le cadre d'en bas représente les fichiers une fois triés ? |
Non, c'est la liste brute telle qu'elle est sortie par readdir() (Sous Windows 98 / Dev-C++). Je voulais illustrer le fait qu'elle n'était pas triée et que l'affirmation
Citation : "Avec ca tes fichiers sont triés et affichés du plus ancien au plus recent" |
était fausse.
Citation : |
Je n'ai fait aucune 'modif'. Je n'ai fait que mettre en oeuvre la liste avec les dates de modifications. Je n'ai rien trié du tout, et visiblement l'ordre est imprévisible.
Citation : |
C'est pas ce que je constate. C'est peut être vrai sur un certain système, mais pas partout en tout cas. Que dit la norme ?(POSIX.1)
Suite à cette question existentielle de la plus haute importance, j'ai ajouté un topic dans mes notes sur POSIX.1
http://mapage.noos.fr/emdel/notes.htm#posix
(commentaires bienvenus)
Marsh Posté le 22-04-2005 à 23:27:30
Me semblait que le readdir lisait les fichiers dans l'ordre de l'index, point barre. A priori, aucune notion de timestamp sur le readdir, ou alors j'ai zappé un truc.
Marsh Posté le 23-04-2005 à 09:03:49
Elmoricq a écrit : Me semblait que le readdir lisait les fichiers dans l'ordre de l'index, point barre. A priori, aucune notion de timestamp sur le readdir, ou alors j'ai zappé un truc. |
readdir n'est qu'une fonction qui lit un répertoire; à savoir un fichier contenant la liste d'autres fichiers.
La fonction lit donc le répertoire tel qu'il est écrit. Si le répertoire a été créé puis rempli d'une traite, les fichiers affichés seront évidemment affichés par ordre de création puisque c'est aussi l'ordre de remplissage. En revanche, si le répertoire a été plusieurs fois modifié, avec effacement, renommage et recréation de fichiers, l'ordre de lecture par "readdir" sera très difficile à prévoir (d'où le raccourci syntaxique "imprévisible" utilisé par Emmanuel bien que ça ne le soit pas réellement)
Marsh Posté le 23-04-2005 à 16:41:58
Sve@r a écrit : readdir n'est qu'une fonction qui lit un répertoire; à savoir un fichier contenant la liste d'autres fichiers. |
Ce que je disais, mais en beaucoup plus clair que ce que j'ai écrit.
Marsh Posté le 23-04-2005 à 19:42:35
Elmoricq a écrit : Ce que je disais, mais en beaucoup plus clair que ce que j'ai écrit. |
Vi, ça c'est mon truc pour paraître brillant en société
Je lis un truc, s'il est pas trop dur j'arrive à le comprendre puis je le réexplique en plus long
Marsh Posté le 25-04-2005 à 09:54:50
Comment je peux faire alors pour trier mes fichiers par date ???
Marsh Posté le 25-04-2005 à 10:08:04
sbucci2 a écrit : Comment je peux faire alors pour trier mes fichiers par date ??? |
Ou
-------------------------------
[1] valeur native de type time_t donnée par stat()...
Marsh Posté le 28-04-2005 à 21:31:19
Froozen a écrit : Et sous Linux ? |
Pareil. opendir() / readdir(), c'est du POSIX.1. Linux est compatible.
Marsh Posté le 28-04-2005 à 21:32:52
Je me suis trompé de topic, je voulais demander comment récupérer sous linux le résultat d'une commande ( system("ps -aux" ) par exemple) dans un buffer
Marsh Posté le 28-04-2005 à 21:34:51
Froozen a écrit : Je me suis trompé de topic, je voulais demander comment récupérer sous linux le résultat d'une commande ( system("ps -aux" ) par exemple) dans un buffer |
Rediriger :
system("ps -aux > out.txt" );
ou avec popen()...
Je ne suis pas spécialiste de Linux...
Marsh Posté le 28-04-2005 à 21:37:04
Voilà c'est noté "_popen" sous MSDN donc je voulais connaître l'équivalent sous Linux Le but c'était justement d'éviter de passer par un fichier texte
Je vais donc essayer popen !
Marsh Posté le 10-12-2005 à 19:05:16
Bonjour à tous,
Me concernant j'ai un petit soucis semblable.
J'arrive à afficher la liste des fichiers présents dans un répertoire, hors maintenant j'aimerais stocker cette liste
dans un buffer (char* buff[]). Pas moyen de trouver les commandes
Pourriez vous m'aider et compléter mon code ?
Code :
|
merci
Marsh Posté le 10-12-2005 à 19:16:40
doudoudetahiti a écrit : |
Tu as déjà un fprintf(). Il suffit d'utiliser sprintf() avec un tableau de taille suffisante. Ensuite, faire une copie 'dynamique' (strdup(), par exemple) et stocker l'adresse dans un tableau de pointeur sur char suffisamment grand.
On peut aussi utliser temporairement une liste chainée qui évite de se poser la question de la taille, quitte à la transformer ensuite en tableau de char *, ce qui facilite les traitements et autres tris...
NOTA : strdup() est POSIX.
Marsh Posté le 11-12-2005 à 11:19:11
Je ne vois pas du tout comment faire, moi j'aimerais enregistrer tous le noms des fichiers dans un tableau à deux dimensions, sa taille est donc variable et dépend du nombre de fichier.
sprintf renvoie la longueur de la chaine.
Pour être clair, je veus parcourir un répertoire, et stocker les noms de ce répertoire.
De même, la difficulté est telle que, ne connaissant pas le nombre de fichier dans mon rpertoire ila va falloir réallouer la taille de mon char** dans chaque boucle.
Si je pouvais avoir un exemple de code pour mon problème, ce serait super sympa
Marsh Posté le 11-12-2005 à 11:31:58
doudoudetahiti a écrit : Je ne vois pas du tout comment faire, moi j'aimerais enregistrer tous le noms des fichiers dans un tableau à deux dimensions, sa taille est donc variable et dépend du nombre de fichier. |
J'ai bien compris ce que tu voulais faire, mais non, je ne te donnerais pas d'exemple de code, parce que c'est toi qui vas trouver le tout seul. On va y passer la journée si il le faut mais je te garantis que tu vas y arriver.
Le but est de réaliser ceci (par exemple):
|
1er exo :
Poste le code.
Marsh Posté le 11-12-2005 à 11:36:29
doudoudetahiti a écrit : Je ne vois pas du tout comment faire, moi j'aimerais enregistrer tous le noms des fichiers dans un tableau à deux dimensions, sa taille est donc variable et dépend du nombre de fichier. |
une liste chainee ?
Marsh Posté le 11-12-2005 à 11:46:49
Voilà ce ue qj'ai fait, mais n'étant pas très fort en pointeur, jai un soucis de compilation.
Je déclare donc un tableau de pointeur qui va pointer sur plusieur chaine de caractère.
Avec la fonction sprintf je récupère le nome du fichier et strdup me permet de stocker le pointeur (qui pointe sur le fichier) dans mon tableau.
De plus, voici les erreurs qui me sont renvoyées
"main.c: Dans la fonction « list_dir »:
main.c:134: attention : implicit declaration of function `strdup'
main.c:134: attention : affectation transforme un entier en pointeur sans transtypage"
Que dois je corriger
Code :
|
Marsh Posté le 11-12-2005 à 11:58:08
doudoudetahiti a écrit : Je déclare donc un tableau de pointeur qui va pointer sur plusieur chaine de caractère. |
Ok, tu ne veux pas suivre ma méthode, libre à toi.
Citation : |
J'ai pas compris comment, et de toutes façons, ça ne sert à rien.
Citation : |
Non. strdup() permet de faire une copie dynamique (malloc()) de la chaine. Elle renvoie une adresse qui est stockée dans le tableau de pointeurs. Tu peux passer à strdup() l'adresse du nom de fichier qui est dans la structure (p->d_name)
Citation : |
Ben oui, il manque un prototype (<string.h>, si je me souviens bien).
Hum, tu cherches à faire quoi ici:
fic = p->d_name; |
*(liste+i) |
est une façon compliquée d'écrire
liste[i] |
d'autre part, il ne faut pas déborder du tableau. Si i vaut MAX_FIC, il faut arréter ou agrandir (on ne peut pas agrandir un tableau de taille fixe).
Marsh Posté le 11-12-2005 à 12:14:45
Citation : |
Je l'ai pourtant mise la libraire.
Citation : Hum, tu cherches à faire quoi ici: |
Hummn je sai pas trop
je travaille dessus, j'envoie incéssament sous peu ma nouvelle version, merci encore de m'aider
Marsh Posté le 11-12-2005 à 12:19:20
doudoudetahiti a écrit :
|
Tu parles du header <string.h> ?
http://www.linux-kheops.com/doc/ma [...] dup.3.html
Ok. Quelles sont tes options de compilation ?
Marsh Posté le 11-12-2005 à 12:29:22
ReplyMarsh Posté le 11-12-2005 à 12:33:34
doudoudetahiti a écrit : je compile de la façon suivante : |
Ok. Retire le '-ansi', car strdup() n'est pas ANSI, mais POSIX.
Je conseille ceci :
gcc -Wall -Wextra -O2 -o main main.c |
Marsh Posté le 11-12-2005 à 13:03:29
Code :
|
bon maitenant va falloir gérer les sous répertoires.
Si je fais un test du genre, si (opendir d'un nom est vraie) // alors c un répertoire et là je fais un appel récursif de la fonction
Marsh Posté le 11-12-2005 à 13:50:21
doudoudetahiti a écrit :
|
Désolé de te dire que ton code ne fonctionne pas du tout. Pour éviter ça, je t'avais proposé une approche pas à pas. Tu n'en pas pas voulu, je ne sais plus quoi faire pour toi...
Marsh Posté le 11-12-2005 à 14:03:45
Emmanuel Delahaye a écrit : Désolé de te dire que ton code ne fonctionne pas du tout. Pour éviter ça, je t'avais proposé une approche pas à pas. Tu n'en pas pas voulu, je ne sais plus quoi faire pour toi... |
Je propose une danse de la pluie.
Ca ne sert à rien, mais c'est distrayant.
Marsh Posté le 11-12-2005 à 14:44:45
Emmanuel Delahaye a écrit : On va y passer la journée si il le faut mais je te garantis que tu vas y arriver. |
Ca, ça s'appelle "avoir la foi"
Marsh Posté le 11-12-2005 à 14:49:18
Sve@r a écrit : Ca, ça s'appelle "avoir la foi" |
J'ai confiance dans mon approche pas à pas, mais comme le gus ne veut en faire qu'à sa tête, qu'il se démerde...
Pour changer, je vais aller faire un peu de musique, tiens...
Marsh Posté le 11-12-2005 à 16:16:30
ça marche très bien !
Citation : J'ai confiance dans mon approche pas à pas, mais comme le gus ne veut en faire qu'à sa tête, qu'il se démerde... |
Désole d'avoir choisis un autre chemin, mais je suis loins d'être un spécialiste en prog.
De plus, j'aurai bien voulus suivre tes indications, mais je n'étais pas du tout près à passer la journée dessus étant donné que ceci est une infime partie de mon projet que je dois rendre demain.
Cependant, j'y travaille toujours notamment sur l'appel récursif de la fonction lorsque que le nom du fichier enregistré est en fait un sous répertoire.
Je cherche donc à stocker à la suite de ma liste de stockage les fichiers qui sonr présents dans les sous répertoires.
Donc si tu changes d'avis, ton aide et ton opinion sont la bienvenue.
merci encore
Marsh Posté le 22-04-2005 à 16:15:25
Il y a t il une methode simple de lister les fichiers situer dans un repertoire en les triant par date.
Je suis en C sous bash.
Merci