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 :

Programme équivalent à DIR [Débutant(e)]


Sujet :

C

  1. #1
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut Programme équivalent à DIR
    Bonjour, je cherche à réaliser un programme en C (multi plateforme) et sans utiliser de toolkit qui permet de répertoirier les dossiers et fichiers ainsi que des infos comme "modifier le, type ...". Pouvez-vous me donner quelques pistes. Merci d'avance

    PS: Je suis en 1 S SVT donc ce n'est pas pour mes études mais pour moi J'aime me fixer des objectifs et les atteindre Je n'ai pas de limitte de temps.

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    [QUOTE=kiki67100;2479050]Pour lister, le code se trouve dans les pages source du site
    http://c.developpez.com/sources/?page=V#FICHIER_lister

    Pour les infos, il te faut utiliser la fonction fstat.
    http://man.developpez.com/man2/fstat.2.php
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Merci pour tout Je vais voir ca, je post résolu

  4. #4
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <dirent.h>
    void usage(char *name)
    {
       printf("Usage : %s [directory]\n", name);
    }
    int lister(char *directory)
    {
       DIR *dir = NULL;
       struct dirent *file = NULL;
       if((dir = opendir(directory)) == NULL)
       {
          return EXIT_FAILURE;
       }
       printf("Repertoire %s :\n", directory);
     
       while((file = readdir(dir)) != NULL)
       {
          if(strcmp(file->d_name, ".") && strcmp(file->d_name, ".."))
          {
             if(file->d_type == DT_DIR)
             {
                lister(strncat(directory, file->d_name, 256));
             }
             else
             {
                printf("\t%s\n", file->d_name);
             }
          }
       }
     
       printf("Fin repertoire %s\n", directory);
     
       closedir(dir);
     
       return EXIT_SUCCESS;
    }
    int main(int argc, char **argv)
    {
       char directory[256];
     
       fgets(directory, sizeof directory, stdin);
     
       return lister(directory);
    }
    Bonjour (alors j'ai simplement copier et modifier ce code car je cherche à comprendre comment il fonctionne après je créerai mon propre programme de listage avec des détails sur le fichiers...)

    Pour le moment j'ai un problème :

    Compilateur: Default compiler
    Building Makefile: "C:\Users\SamSoft\Documents\Programmation\projets\C\FilesFolders\Makefile.win"
    Exécution de make...
    make.exe -f "C:\Users\SamSoft\Documents\Programmation\projets\C\FilesFolders\Makefile.win" all
    gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"
    main.c: In function `lister':
    main.c:28: error: structure has no member named `d_type'
    main.c:28: error: `DT_DIR' undeclared (first use in this function)
    main.c:28: error: (Each undeclared identifier is reported only once
    main.c:28: error: for each function it appears in.)
    make.exe: *** [main.o] Error 1
    Exécution terminée
    Merci d'avance

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
             if(file->d_type == DT_DIR)
    Je ne pense pas que POSIX.1 définisse une champ d_type.

    Citation Envoyé par POSIX.1
    The internal format of directories is unspecified.

    The <dirent.h> header shall define the following type:

    DIR
    A type representing a directory stream.

    It shall also define the structure dirent which shall include the following members:

    [XSI][Option Start]
    ino_t d_ino File serial number.
    [Option End]
    char d_name[] Name of entry.
    Pas de d_type. Se méfier des extensions non portables...
    Pas de Wi-Fi à la maison : CPL

  6. #6
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Si je me trompe pas, la version POSIX.1 est ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct  dirent {
                   ino_t           d_ino;
                   off_t           d_off;
                   unsigned short  d_reclen;
                   char            d_name[1];
           };
    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 !

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Si je me trompe pas, la version POSIX.1 est ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct  dirent {
                   ino_t           d_ino;
                   off_t           d_off;
                   unsigned short  d_reclen;
                   char            d_name[1];
           };
    Tu te trompes. Seul le champ d_name est garanti. Même d_ino est optionnel.

    http://www.unix.org/single_unix_specification/
    Pas de Wi-Fi à la maison : CPL

  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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ok
    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 !

  9. #9
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Donc MinGW est à la norme POSIX 1. ? Comment puis-je résoudre ceci

    (Pourquoi y a t'il un code non comforme à POSIX sur le site ? )

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Donc MinGW est à la norme POSIX 1. ? Comment puis-je résoudre ceci
    Déterminer si une entrée est un répertoire ?

    Ma technique de goret (windows/unixoides) : chdir()[1]. Si ça couine (code retour), c'est que ce n'est pas un répertoire. (sinon, remonter d'un cran : "..").

    (Pourquoi y a t'il un code non comforme à POSIX sur le site ? )
    Bah, ça s'appelle un bug. Signale le à l'auteur...

    -------------------
    [1] sauf pour "." et "..", évidemment...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Ok, je verrai ca vendredi soir Merci Emmanuel.

    PS: Je vais à la piscine

  12. #12
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ah oui exact le code ne fonctionne pas avec mingw.

    Tu peux te fabriquer ta propre fonction pour savoir un un répertoire est un répertoire avec chdir ou opendir (chdir est mieux ça utilise moins de lignes ).
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Déterminer si une entrée est un répertoire ?

    Ma technique de goret (windows/unixoides) : chdir()[1]. Si ça couine (code retour), c'est que ce n'est pas un répertoire. (sinon, remonter d'un cran : "..").


    le mien (de code de goret)

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <dirent.h>
    #include <errno.h>
     
     
     
    int IsDirectory ( char *Name )
    {
      DIR  *TempDir=(DIR *)NULL ;
      char *Tempo = (char *)NULL ;
      int   s ;
     
      Tempo = (char *) calloc ( 5000, sizeof(char) );
      if ( Tempo == (char *)NULL )
         return 0 ;
     
      if ( (TempDir = opendir(Name)) == (DIR *)NULL )
        {
           if ( errno == ENOTDIR )
             {
    	    free ( Tempo );
    	    return 0 ;
              }
     
           sprintf ( Tempo, "cd %s  > /dev/null 2>&1",Name);
           s = system ( Tempo );
           if ( s != 0 )
             {
    	    free ( Tempo );
    	    return 0 ;
             }
        }
      else
         closedir (TempDir);
     
      free ( Tempo );
      return 1 ;
    }
    berk !!! mais ça marche
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par souviron34 Voir le message


    le mien (de code de goret)

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <dirent.h>
    #include <errno.h>
     
     
     
    int IsDirectory ( char *Name )
    {
      DIR  *TempDir=(DIR *)NULL ;
      char *Tempo = (char *)NULL ;
      int   s ;
     
      Tempo = (char *) calloc ( 5000, sizeof(char) );
      if ( Tempo == (char *)NULL )
         return 0 ;
     
      if ( (TempDir = opendir(Name)) == (DIR *)NULL )
        {
           if ( errno == ENOTDIR )
             {
    	    free ( Tempo );
    	    return 0 ;
              }
     
           sprintf ( Tempo, "cd %s  > /dev/null 2>&1",Name);
           s = system ( Tempo );
           if ( s != 0 )
             {
    	    free ( Tempo );
    	    return 0 ;
             }
        }
      else
         closedir (TempDir);
     
      free ( Tempo );
      return 1 ;
    }
    berk !!! mais ça marche
    Ah ouais quand même.

    Moi je pensais à un truc dans ce genre

    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
     
    int is_dir(char *name)
    {
        DIR *dir = NULL;
        int ret = 0;
     
        dir = opendir(name);
        if(dir == NULL && erno == ENOTDIR)
        {
            ret = 0;
        }
        else
        {
            closedir(dir);
            ret = 1;
        }
     
        return ret;
    }
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    stat permet d'en savoir plus sans passer par du code de goret et en restant POSIX.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  16. #16
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Oui, je compte utiliser stat mais d'abord comprendre comment lister les fichiers et les dossiers

  17. #17
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Oui, je compte utiliser stat mais d'abord comprendre comment lister les fichiers et les dossiers
    Il voulait dire que la fonction stat permet via une macro et un champs de la structure stat de savoir si un fichier est un répertoire ou pas.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  18. #18
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Ah ok

    Mais j'ai pas compris à quel endroit du code dois-je vérifier si c'est un fichier ou un dossier ?

    (c.f : code sur la page 1)

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Mais j'ai pas compris à quel endroit du code dois-je vérifier si c'est un fichier ou un dossier ?
    Une fois que tu as le nom de l'entrée, tu appelles stat() et un des champs de la structure te dit si c'est un répertoire ou non. Vas-y, ça va pas te manger...

    (essaye stat() toute seule si tu as peur...)
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Plutôt que file->d_type == DT_DIR, tu utilises stat (fstat prend un fileno, lstat a un comportement différent avec les liens symboliques).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 7 12345 ... DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/05/2010, 13h56
  2. [Programmation]Faire du COM/OLE sous Linux ou équivalence
    Par randriano dans le forum Applications et environnements graphiques
    Réponses: 13
    Dernier message: 12/06/2008, 08h51
  3. Réponses: 3
    Dernier message: 14/08/2006, 22h08
  4. [EDI] Outil de programmation PHP équivalent à VSS
    Par bourvil dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 23/02/2006, 16h18

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