Aller au menu - Aller au contenu

Parcourir les dossiers avec dirent.h


Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Pseudo Commentaire
Page 1 
Hors ligne Sergeswi # Posté le 20/10/2009 à 20:50:28
SErGeSWI = 614,77 g/mol
Avatar

Ville : Perpignan
Pays : France métropolitaine

J'ai survolé le tutoriel, c'est sympathique ^^ . Bon ça me concerne pas trop mais ça semble bien ;) . Par contre, je sais pas si tu as le droit d'utiliser une image source de Windows, non ? :p
 
Hors ligne Grinwik # Posté le 20/10/2009 à 21:51:04
"Ca passait, c'était beau !"
Avatar

Ville : Talence
Pays : France métropolitaine

Beau travail. Bonne initiative pour errno =)

Quelques remarques cependant :
-> A quoi sert l'argument rep de la fonction parcourirDossier() ?

->
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
int main()
{
    DIR* rep = NULL;
    char chemin[500] = "";

    parcourirDossier(rep, chemin);

    closedir(rep);

    return 0;
}

Même chose : rep ne sert pas à grand chose; de même que le closedir() vu que le pointeur ne peut pas être modifié.

-> isDir() bien, ça dépanne ^^
Mais, en particulier sous unixoide, il est courant qu'un fichier n'ait pas d'extension.
Si tu n'as pas envie de développer ici, soit, mais je pense que parler un peu de stat() pourrait être sympa.

->
Citation :
dirent est un standard pour UNIX qui a été porté pour Windows par la suite. :)

Manque-t-il un mot ?
dirent.h est un header standard.

-> Premier QCM :
Citation :
Quel est le problème dans ce code :

return 1; :p
Hors ligne TuxWeb # Posté le 20/10/2009 à 22:36:45
GPG key ID : 4BE9852B
Avatar

Ville : Compiègne
Pays : France métropolitaine
études : UTC

Bon tuto ;)

Mais j'aurais plutôt tendance à faire :
Code : C
1
return (ent->d_type == DT_DIR);


pour tester si un fichier est un dossier ou non, car un fichier peut très bien ne pas avoir d'extension (du moins, sous Linux...)

Citation : Emmanuel KANT
Je n'ai pas besoin de penser pourvu que je puisse payer ; d'autre se chargeront bien de cette besogne.


Image utilisateur
 
Hors ligne spider-mario # Posté le 21/10/2009 à 07:53:02
Avatar

Ville : Montigny-lès-cormeilles
Pays : France métropolitaine

Citation : Le tuto
Mauvaise réponse

Pourquoi on ne considère pas dirent.h comme portable ?
Mauvaise réponse : dirent.h est portable.
La bonne réponse était : À la base, c'est un header pour UNIX, mais il a été porté pour Windows.

Explications : Relisez le début du chapitre ! dirent.h est un header sous la norme POSIX, qui est une norme standard pour les sytèmes UNIX. Il a été porté pour Windows par la suite. ;)

Le résultat, c'est qu'il est portable, c'est ce qui compte...
Qt a d'abord été développé pour Windows et Unix, le support de Mac OSX n'est apparu qu'avec Qt3, pourtant on considère Qt comme portable sur ces trois plateformes.
Hors ligne glator # Posté le 21/10/2009 à 10:58:18

études : Polytech'Montpellier

Bon tuto, cependant quelque chose me gène, au niveau de la fonction isDir(): un répertoire peut très bien avoir un nom comme "photo.jpg", la fonction n'est donc pas fiable a 100%.

Voilà la fonction la plus simple que j'ai trouvé:
Code : C
1
2
3
4
5
6
7
8
#include <sys/stat.h>

int isdir(const char *path)
{
    struct stat stats; //contient diverses informations sur le fichier/répertoire
    return stat(path, &stats) == 0 && //vérifie que le "remplissage" de la structure s'est bien passé
           S_ISDIR(stats.st_mode); //tu l'aura deviné ;) 
}
Hors ligne Peaker # Posté le 21/10/2009 à 12:48:26
Shit happens
Avatar

Ville : Genève
Pays : Suisse

Bon tuto et fort pratique... Moi qui me démenait depuis plusieurs heures sur <dirent.h>
BOUM un nouveau tutoriel... :p

EDIT : une petite remarque : pour vérifier si il s'agit d'un fichier ou d'un dossier tu dit :

Citation : Monsieur_JaKy
Vérifier si le nom du fichier a une extension (.jpg, .mp3, etc.).

Les dossiers peuvent aussi contenir des points !

A+
 
Hors ligne Falco252 # Posté le 21/10/2009 à 13:03:29
My Life for Aiur !
Avatar

Serge : http://www.siteduzero.com/tutoriel-3-1 [...] allation.html

<vista> aider moi svp
<vista> comment je peux downgrade ma 2.81
<%meuhlavache> vista: t'sa un pote avec une psp déjà downgrader ?
<vista> un pote?
<%meuhlavache> t'as pas de pote vista ?
<vista> c koi un pote stp?
 
Hors ligne Chlab_lak # Posté le 21/10/2009 à 16:31:02
Tendou
Avatar

études : Ecole Supérieure de l'ETML

Citation : Grinwik
mais je pense que parler un peu de stat() pourrait être sympa.

Essentiel ;)
 
Hors ligne Nyxem # Posté le 21/10/2009 à 19:13:30
Ou pas.
Avatar
Flux RSS

Sur certains OS y a une macro pour savoir si le fichier est un répertoire -> S_ISDIR(mode_t mode)

Plus tu pédales moins fort, moins t'avances plus vite.
--> mon blog (Mac OS, Prog, Sécu) <--
--> Forcer le boot en 64-bit sous Snow Leopard <--
 
Hors ligne Loadware # Posté le 21/10/2009 à 20:27:20
Biozazard!
Avatar

Ville : Niderviller
Pays : France métropolitaine

merci pour ce tuto! j'avais essayé de lire plusieurs fois la doc en anglais sur dirent.h mais c'est... comment dire? :-° horrible ^^

Image utilisateur

Envie de faire du logiciel libre sans utiliser les licences GNU ou BSD ?
Pensez à la licence française de logiciel libre CeCILL!
 
Hors ligne Zaïmone # Posté le 21/10/2009 à 22:54:51

Ville : Talence
Pays : France métropolitaine
études : Enseirb-Matmeca

Tu devrais changer l'icône du tuto.
Quand j'ai vu un dossier window$, je me suis dit d'office "Ce tuto n'est pas pour moi !"
alors qu'en fait tu parle d'un header.

Bon tuto BTW ! ;-)
Hors ligne Animaluxe # Posté le 22/10/2009 à 06:42:24
Le ; Et tout va...
Avatar

Ville : Basillac
Pays : France métropolitaine

Pouvez-vous donner des explications supplémentaire s'il vous plaît?
Je n'ai pas compris certaines parties alors plus d'informations ne seraient pas de trop! :)
 
Hors ligne Algo-rythme # Posté le 22/10/2009 à 07:05:48
Qu'est-ce qu'on mange ?
Avatar

Code : C
1
if ((strchr(ent->d_name, '.')) == NULL) /* Si le nom du fichier n'a pas de point (une extension). */


Il est possible qu'un fichier n'ai aucune extension.
À part ça, excellent tutorial. Je me posait la question depuis beaucoup de temps.

Merci ! 19/20

Citation : ZéroNumberZéro
Les dossiers peuvent aussi contenir des points !

Secret (cliquez pour afficher)
Frigidaire.
 
Hors ligne Chlab_lak # Posté le 22/10/2009 à 18:57:59
Tendou
Avatar

études : Ecole Supérieure de l'ETML

Citation : Nyxem
Sur certains OS y a une macro pour savoir si le fichier est un répertoire -> S_ISDIR(mode_t mode)

S_ISDIR() sous unix et _S_ISDIR() sous win si mes souvenirs sont bons. Cela implique une utilisation de stat() (_stat() sous win) ;)
 
Hors ligne Rykyu # Posté le 23/10/2009 à 09:40:28
Ne peut pas plaire à tous
Avatar

Je n'ai pas pu aller bien loin dans le tuto, vu que je me suis heurté à ce petit problème... :euh:
Une solution ?

Je trouvais mes messages vides, sans signature...
 
Hors ligne Monsieur_JaKy # Posté le 23/10/2009 à 19:17:26
JaKy & Rory FTW!
Avatar

Ville : Bourges
Pays : France métropolitaine

Désolé à tous, j'avais totalement oublié qu'un fichier sous Linux n'avais pas forcément d'extension :(
Je ne connaissais pas la fonction stat(), je vais me documenter la dessus et en parler un peu dans un prochain EDIT ;)
J'avais aussi oublié que les dossiers pouvaient contenir des points, j'ai tout faux :euh:
Grinwik >
- Concernant le dernier exercice, tout à fait c'est inutile de repasser rep à chaque fois :)
- Merci pour l'oubli ;)
- Merci aussi, j'utiliserais EXIT_FAILURE ;)
spider-mario >
Il y a tout de même une différence entre Qt et dirent.h : Qt n'est sous aucune norme (?), alors que dirent.h sous POSIX.
Rykyu > J'ai faux une fois de plus :( J'essayerais d'expliquer comment faire dans un prochain edit.

Merci à tous pour vos commentaires ^^
 
Hors ligne spider-mario # Posté le 24/10/2009 à 13:36:48
Avatar

Ville : Montigny-lès-cormeilles
Pays : France métropolitaine

Citation : Monsieur_JaKy
Il y a tout de même une différence entre Qt et dirent.h : Qt n'est sous aucune norme (?), alors que dirent.h sous POSIX.

Je ne vois vraiment pas ce que ça change.
dirent.h est sous norme POSIX, Qt est sous norme... "Qt". Aucune ne fait partie du C standard, pourtant Qt est considérée comme portable et dirent.h ne l'est pas dans le QCM. Y a-t-il la moindre explication à cela, excepté le fait que "ça a été porté sous Windows plus tard" ?
Ça a forcément été réécrit d'un système à l'autre, comme le code de n'importe quel header, qu'il soit ANSI, POSIX...
Hors ligne Fredos # Posté le 24/10/2009 à 18:44:42
Avatar

Ville : Sartrouville
Pays : France métropolitaine
études : ENSEA

Très bon tuto agréablement rédigé, dommage pour les quelques fautes déjà relevées qui seront bientôt corrigées je pense.
Hors ligne Algo-rythme # Posté le 26/10/2009 à 20:01:17
Qu'est-ce qu'on mange ?
Avatar

Citation : JaKy
Désolé à tous, j'avais totalement oublié qu'un fichier sous Linux n'avais pas forcément d'extension


Tu peux aussi mettre aucune extension sous windows aussi. Il suffit de modifier les option d'affichage de nom des fichiers pour que windows affiche les extentions et de renommer le fichier.

Secret (cliquez pour afficher)
Frigidaire.
 
Hors ligne LohGeek # Posté le 26/10/2009 à 22:57:48

Grand Merci, c'était rapide, clair et indolore ;) . J'ai ainsi pu débloquer un gros problème sur un de mes programmes...> ^^
Hors ligne Wotan # Posté le 31/10/2009 à 22:47:48
Avatar

Super tutoriel, très utile sa faisait longtemps que j'en cherchait un, merci =)
Hors ligne ARMAG3DON # Posté le 11/11/2009 à 18:16:32
Avatar

Salut a tous
En fait je tiens à féliciter M_JaKy
parceque je charchais partout comment utiliser dirent.h ^^
...
...:euh:Mais voilà, j'ai quand meme du mal à l'utiliser sous Visual et sous C::Blocks
(beaucoup moins de mal en utilisant la Console),& ce que j'essaye de faire , c'est l'utiliser avec la SDL...
mé j'y arrive pas.
Alors si quelqu'un sais comment faire, je lui demanderais bien de m'aider...

Merci d'avance & A+
Hors ligne Bladiest # Posté le 25/11/2009 à 15:35:12
Libre... Toujours !
Avatar

études : CESI Paris

Plus sur la forme que sur le fond : Y a beaucoup de smiley !

Si je t'attends pour partir et si tu m'attends également, alors on est pas arriver !
 
Hors ligne DocSkineur # Posté le 30/11/2009 à 12:57:18
Avatar

Ville : Seyssins
Pays : France métropolitaine

Bonjour,

Dans le tuto il y a ecrit dans la partie consacré à errno :
"Si la chaîne envoyée à perror est nulle, alors les deux points ne seront pas imprimés. Mais si vous envoyez une chaîne de caractères non nulle, ils le seront."
C'est pas tellement vrai, les deux points en plus apparaissent simplement parcque la chaine envoyée contient deux points :
En écrivant : Code : C
1
perror("ERREUR ");
il n'y aura qu'une seul fois les deux points et la console affichera : Code : Console
ERREUR : No such file or directory

Faites le test en envoyant une chaine contenant uniquement un espace, on voit bien qu'il y a deux points.

Par contre il est vrai que si la chaine envoyé est nul, aucun deux points n'apparait.

Bon c'est pas super important mais je trouvait ça bizarre.


En dehors de ca c'est un exelent tuto, clair, vivant avec de bon exemples.
Bravo!

Secret (cliquez pour afficher)
20/20
Hors ligne max840 # Posté le 06/12/2009 à 03:54:26
Mac 4 ever
Avatar

Moi ça ne marche pas le code pour voir si c'est un dossier. J'ai fais un copier/coller du code dans le tuto et ça ne marche pas. :(

Image utilisateurImage utilisateur
Image utilisateurImage utilisateur
 
Hors ligne geekologue # Posté le 19/12/2009 à 00:20:13

Salut,

Bon tuto.

J'ai quelques remarques concernant la partie Exercices :
le nom d'un répertoire peut contenir des points, une solution :
Code : C
1
2
3
4
5
6
7
8
int isDir(const char* ent) {
    DIR* dir = opendir (ent);
    if (!dir)
        return 0;

    closedir (dir);
    return 1;
}

pour la fonction qui compte le nombre de fichiers, tu fait autant de tests qu'il y a de fichiers. Pourquoi pas soustraire 2 à la fin ?

Memorable quotes :
  • On a long enough time line, the survival rate for everyone drops to zero.
  • Perhaps it is good to have a beautiful mind, but an even greater gift is to discover a beautiful heart.
 
Hors ligne Fort en pommes # Posté le 03/02/2010 à 15:03:23
Avatar

Très bon tutoriel, c'est pile ce que je cherchais en parallèle de mes lectures sur le C. :p
J'ai une petite question sur l'exercice "Compter le nombre de fichiers".
Une fois que la fonction est crée, comment récupère-t-on le nombre de fichiers contenu dans le répertoire?
En tant que gros débutant en C, je pensais faire un printf("%d",compterFichier), mais cela me renvoie "2293584" alors que j'ai seulement 8 fichiers dans mon répertoire...
Où est mon erreur les Zéros? ^^
Pour accéder à cette section
Connectez-vous !
connexion_rpx