IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Implémentation de la fonction find en C


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Implémentation de la fonction find en C
    Bonjour à toutes et à tous.

    Première chose à savoir : j'ai légèrement développé en C ces deux dernières années, mais très légèrement. Je n'ai eu aucun véritable cours de C et j'ai appris le peu que je sais sur le tas. J'ai quelques notions et soif d'apprendre, mais mes connaissances et mon expérience en programmation sont tout de même assez limitées.

    Deuxième chose : j'ai évidemment parcouru quelques discussions sur le forum et d'autres sites concernant la fonction find, puisqu'il semblerait que ce soit un exercice phare que les profs aiment donner aux étudiants. J'ai lu pas mal de choses intéressantes, mais j'ai vu tellement de choses différentes que ça m'a un peu embrouillé l'esprit.

    Voici le projet que j'ai à réaliser : je dois ré-implémenter la fonction find de Linux en C, avec un maximum d'options. Le programme doit fonctionner sous Linux ET Windows (et là je me pose la question de l'arborescence qui n'est pas la même et comment gérer les "/" de Linux et les "\" de Windows).

    Pour le moment, je me suis fixé ces options, qui me semblent être les plus simples à réaliser en plus du find de "base" :
    -name
    -atime
    -ctime
    -mtime
    -amin
    -cmin
    -mmin
    -size
    -type
    -delete
    -print (de base)
    --help

    Chaque option serait une fonction dans mon programme.

    Concernant l'algorithme, j'ai déjà réfléchis et en gros je compte faire ça :

    1) Analyser les arguments.

    Je pensais ici utiliser getopt, qu'en pensez-vous ?
    Dois-je placer mes différentes options possibles (-name, -size,e tc.) dans un fichier .txt que mon programme lirait pour les placer en arguments dans getopt ?

    Admettons que je suive cette logique :

    -Tant qu'on ne tombe pas sur un argument commençant par "-", c'est le répertoire dans lequel je dois effectuer ma recherche. S'il n'y a aucun chemin fournit en paramètre, on prend par défaut le répertoire dans lequel on se trouve.

    -Si on trouve un argument commençant par "-", ça devrait être une option. On vérifie par rapport aux fonctionnalités du programme (liste des mes options possibles dans un fichier .txt avec un retour à la ligne à la fin de chaque option ?). A ce moment là, comment savoir si mon option attend ou non des arguments derrière, et combien si c'est le cas ?

    2) Lister les fichiers et répertoires.

    Ma question est ici, pile ou file ? Quels sont les avantages et inconvénients de chacun, et dans le cas présent, lequel me conseillez-vous ?

    3) Filtrer la pile selon les critères.

    Autant pour le nom du fichier je saurais le faire, mais pour les dates de modifications, etc... comment faire ? Y a-t-il une bibliothèque qui me permettrait de récupérer ces informations sur les fichiers et/ou répertoires parcourus ?

    4) Trier la pile.

    5) Exécuter -print ou -delete, ou autre...

    Pour lister les fichiers et répertoires, je me doute que la fonction devra être récursive. Mais est-ce que les étapes suivantes (3/4/5) doivent être réalisées simultanément, pendant la récursivité, ou pas ?

    Merci d'avance pour tout ceux qui pourront me donner une piste ou deux. Si vous avez des fonctions/bibliothèques à utiliser impérativement qui vous viendraient en tête, n'hésitez pas, j'irai jeter un coup d'oeil et voir ce que je peux construire avec ^^

    Cordialement,

    Un étudiant qui sait depuis 11h59 qu'il doit rendre ce projet pour dimanche 23h59 au plus tard =D

  2. #2
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    Citation Envoyé par IaMTouF Voir le message
    3) Filtrer la pile selon les critères.

    Autant pour le nom du fichier je saurais le faire, mais pour les dates de modifications, etc... comment faire ? Y a-t-il une bibliothèque qui me permettrait de récupérer ces informations sur les fichiers et/ou répertoires parcourus ?
    La solution est la structure stat et la fonction correspondante, déclarées dans sys/stat.h, qui te permettent d'obtenir tous les renseignements utiles sur un fichier (y compris de savoir s'il s'agit en fait d'un répertoire).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Ngork Voir le message
    La solution est la structure stat et la fonction correspondante, déclarées dans sys/stat.h, qui te permettent d'obtenir tous les renseignements utiles sur un fichier (y compris de savoir s'il s'agit en fait d'un répertoire).
    Bonjour Ngork ! Très bien, merci de l'info sur ce point, je vais regarder ça de très prêt alors =)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Bon alors après avoir pas mal travailler dessus, je suis bloqué. J'ai l'impression d'avoir un programme fonctionnel et codeblocks ne me retourne plus d'erreurs.

    Or, quand je rentre les arguments à donner au programme, puis que je le compile et l'exécute, j'obtiens dans ma console ceci :

    stat:: No such file or directory

    Process returned 1 (0x1) execution time : 0.007 s
    Press any key to continue
    Je ne comprends pas bien pourquoi =/

  5. #5
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    stat:: No such file or directory c'est typiquement le genre de chose que tu vas obtenir en appelant stat avec, comme premier paramètre, le nom/chemin d'un fichier qui n'existe pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    plx@sony:~/Bureau/DVP/stat$ more stat.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
     
    int main(int argc,char *argv[])
    {
        struct stat struct_stat;
     
        if (stat(argv[1],&struct_stat) != 0)
            perror("stat:");
    }
    plx@sony:~/Bureau/DVP/stat$ 
    plx@sony:~/Bureau/DVP/stat$ make stat
    gcc     stat.c   -o stat
    plx@sony:~/Bureau/DVP/stat$ 
    plx@sony:~/Bureau/DVP/stat$ ./stat stat.c
    plx@sony:~/Bureau/DVP/stat$ 
    plx@sony:~/Bureau/DVP/stat$ ./stat n_existe_pas
    stat:: No such file or directory
    plx@sony:~/Bureau/DVP/stat$
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

Discussions similaires

  1. Utilisation de la fonction find
    Par ylabarre dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 29/08/2007, 16h02
  2. [C++ .NET] Comment utiliser fonction Find ?
    Par thecrax dans le forum Framework .NET
    Réponses: 3
    Dernier message: 17/08/2006, 09h02
  3. [VBA-E]Problème avec la fonction Find
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/04/2006, 18h43
  4. [VBA-E]Fonction .find
    Par marie10 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/01/2006, 11h03
  5. [VBA-E] Fonction "FIND"
    Par cinc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/09/2005, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo