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 :

[Debutant] Navigation rep en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Par défaut [Debutant] Navigation rep en C
    Bonjour à tous,

    Suis en train de programmer, pour un projet, un shell Linux en C.
    parmi les choses à faire je dois permettre la navigation dans les rep.
    Hors cd n'est pas une commande system, je dois donc la programmer...

    Auriez vous des pistes sur le principe ?

    J'ai regardé le man de chdir, mais je ne dois pas les utiliser correctement puisqu'apres avoir fait un chdir(path), si je refait pwd, il n'y a rien de changer
    J'ai loupé qqchose c'est certain

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    En fait, il faut passer par des appels systèmes.

    Au début, tu doit ouvrir un répertoire qui s'il me semble bien passe par une structure de type struct DIR. ensuite tu fait une boucle avec un appel à readdir pour lire chaque entité de ton dossier. readdir te retourne une structure sur l'entité, tu as le nom, l'inode, les droits, ... .

    Ensuite, si tu veux parcourir récursivement ton dossier tu peux le faire en testant si l'entité est un dossier.

    Je te cherche un exemple de la commande find que l'on a fait cette année en TP. Dès que je l'ai je poste ça.

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    J'ai pas retrouvé le fichier mais j'ai une copie papier dont voici les principales lignes :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    void find (const char * nom,const char *rep)
    {
         DIR * dossier;
         struct dirent * fichier;
         struct stat statistiques;
     
    if( ! (dossier = opendir(rep) ) )
    {
         fprintf(stderr,"Ouverture impossible\n");
         exit(1);
    }
    else
    {
         while( (fichier = readdir(dossier) ) != NULL )
         {
              if( strcmp( fichier->d_name , nom ) == 0 )
              {
                    printf("Fichier trouve : %s/%s",rep,nom);
              }
              else
              {
                   snprintf(nom_complet,512,"%s/%s",rep,fichier->d_name);
     
                   if( (lstat(nom_complet,&statistiques) ) != -1 )
                   {
                        if( S_ISDIR(statitiques.st_mode) &&
                             (strcmp(fichier->d_name,".") != 0) &&
                             (strcmp(fichier->d_name,"..") != 0) )
                        {
                             find(nom,nom_complet);
                        }
                   }
              }
              closedir(dossier);
         }
    }
    Voilà, j'espère ne pas avoir fait de faute en recopiant mais comme ça tu as une fonction qui fait office de find. Je pense que ça peut t'aider dans la mesure ou tu vois comment te balader dans les dossiers.
    Si t'a des questions sur ce que j'ai fait, n'hésite pas.

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    j'espère ne pas avoir fait de faute en recopiant
    T'as juste oubilé la déclaration de nom_complet...

    Et ceci devrait se trouver hors du while....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    closedir(dossier);
    Jc

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Par défaut
    Quelle rapidité
    merci du coup de main, je vais bosser la dessus et vous tiendrait au jus.

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Je ne l'ai pas avec moi mais pour tout tes soucis de programmation et d'interraction avec le système d'exploitation linux utilise ce bouquin :

    http://www.editions-eyrolles.com/Livre/9782212116014/programmation-systeme-en-c-sous-linux

    Je suis désolé de faire de la publicité mais c'est un bouquin qui est assez riche (je ne sais pas s'il est complet sur tous les appels système mais j'y ai trouvé mon bonheur).

    Si tu as une bibliothèque universitaire près de toi, vas y et regarde dedans, je sais qu'il y a ce que tu cherches (changement de dossier, ...)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Par défaut
    Merci PRomu@ld de ton coup de main, je n'ai pas eu besoin d'utiliser les appels systemes que tu me proposais, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int
    execute_chdir(char *cmd){
      char *chaine;
      cmd+=3; //cmd contient par exemple "cd /" donc +3 pour enlever le "cd "
      chaine=getcwd(NULL,256);
    printf("le rep courant est :%s\n",chaine);
    printf("on change le rep vers :%s\n",cmd);
      if (chdir(cmd)<0) printf("Erreur de chdir\n");
    chaine=getcwd(NULL,256);
    printf("le rep courant est :%s\n",chaine);
      return 0;
    }

    J'ai en effet commander le bouquin, je vais en avoir besoin pour la suite, les signaux.

    PS : SI QQ'UN peut me dire comment passer le poste en resolu MERCI

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par PRomu@ld
    Je ne l'ai pas avec moi mais pour tout tes soucis de programmation et d'interraction avec le système d'exploitation linux utilise ce bouquin :

    http://www.editions-eyrolles.com/Livre/9782212116014/programmation-systeme-en-c-sous-linux

    Je suis désolé de faire de la publicité mais c'est un bouquin qui est assez riche (je ne sais pas s'il est complet sur tous les appels système mais j'y ai trouvé mon bonheur).

    Si tu as une bibliothèque universitaire près de toi, vas y et regarde dedans, je sais qu'il y a ce que tu cherches (changement de dossier, ...)
    Je confirme, je le possède et il est bien complet et ultra pratique si tu te lances dans le développement en C soux Linux !
    Et voici un code que j'ai fait récement, il peut peut-être aider :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    typedef enum
    {
       DIR_FILE,         /* Affiche ou traite que les fichiers.                */
       DIR_DIRECTORY,    /* Affiche ou traite que les repertoires.             */
       DIR_BOTH,         /* Affiche ou traite les repertoires et les fichiers. */
     
       DIR_NB_TYPE
    }
    e_dir_type;
     
     
    /* --------------------------------------------------------------------------
       dir_browse
       --------------------------------------------------------------------------
       Parcours le repertoire passe en parametre.
       --------------------------------------------------------------------------
       E: Repertoire a parcourir.
       E: Type de parcours  :
             - DIR_FILE        :  Ne traite que les fichiers,
             - DIR_DIRECTORY   :  Ne traite que les repertoires,
             - DIR_BOTH        :  Traite les deux.
       E: Fonction de traitements definie par l'utilisateur.
       S: 0 = OK, -1 = Erreur.
       -------------------------------------------------------------------------- */
    int dir_browse (const char * s_dir_path,
                    const e_dir_type e_type,
                    void (* action_func)(const struct stat * st_status,
                                         const char * s_name))
    {
       int err = 0;
       char tmp_str [512];
     
       DIR            *  dir         = NULL;
       struct dirent  *  st_dir      = NULL;
       struct stat       st_status;
     
     
     
     
       /* ----- Test de la validite des arguments ----- */
     
       if (s_dir_path == NULL)
       {
          /* Erreur: Argument NULL. */
          err = -1;
       }
       else if (action_func == NULL)
       {
          /* Erreur: Pointeur sur la fonction 'action_fun' de valeur NULL. */
          err = -1;
       }
     
       /* ----- */
     
     
     
     
       /* ----- Ouverture du repertoire ----- */
     
       dir = opendir (s_dir_path);
     
       if (dir == NULL)
       {
          /* Erreur d'ouverture du repertoire.
             On quitte la fonction avec un code d'erreur. */
          err = -1;
       }
     
       /* ----- */
     
     
     
     
       /* ----- Parcours et traitements ----- */
     
       if (err == 0)
       {
          while ((st_dir = readdir (dir)) != NULL)
          {
             sprintf (tmp_str, "%s%s", s_dir_path, st_dir->d_name);
     
     
             /* Recuperation des informations sur le fichier en cours. */
             if (stat (tmp_str, & st_status) == 0)
             {
                switch (e_type)
                {
                   /* Action sur les repertoires uniquement. */
                   case DIR_DIRECTORY :
                   {
                      if (S_ISDIR (st_status.st_mode))
                      {
                         action_func (& st_status, st_dir->d_name);
                      }
                   }
                   break;
     
                   /* Action sur les fichiers uniquement. */
                   case DIR_FILE :
                   {
                      if (S_ISLNK (st_status.st_mode) || S_ISREG (st_status.st_mode))
                      {
                         action_func (& st_status, st_dir->d_name);
                      }
                   }
                   break;
     
                   /* Action sur les fichiers et les repertoires. */
                   default :
                      action_func (& st_status, st_dir->d_name);
                }
             }
          }
       }
     
       /* ----- */
     
     
     
     
       /* ----- Terminaison de la fonction ----- */
     
       /* Fermeture du repertoire. */
       closedir (dir);
     
       /* ----- */
     
     
     
     
       return err;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. [DEBUTANT]Problème Navigation JSF
    Par El_touristo dans le forum JSF
    Réponses: 7
    Dernier message: 27/03/2009, 14h58
  2. Réponses: 1
    Dernier message: 04/02/2009, 11h25
  3. [debutant] navigation webform (ouverture et fermeture)
    Par noname_971 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/10/2008, 10h05
  4. [DEBUTANT] accéder à une page (Navigation)
    Par cyrillece dans le forum JSF
    Réponses: 4
    Dernier message: 08/08/2008, 14h02
  5. [Conception][Debutant] Navigation bidirectionnelle
    Par DarkNagash dans le forum Général Java
    Réponses: 11
    Dernier message: 14/02/2006, 08h24

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