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 :

Stat sur un chemin absolue ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Par défaut Stat sur un chemin absolue ?
    Bonjour,

    Je me poses 2 questions sur le fonctionnement de stat.
    Mon but en gros est de recuperer les infos contenus dans cette structure apres son appel sur un fichier / dossier, voici un bout de code pour etre plus clair :

    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
    int             main(int argc, char **argv)
    {
      DIR           *d;
      struct stat   st;
      struct dirent *dir;
     
      if (!(d = opendir(argv[1])))
        {
          my_printf(ERR_OPDIR);
          return (-1);
        }
      while ((dir = readdir(d)))
        {
          stat(dir->d_name, &st);
          display_type(st.st_mode);
          display_perm(st.st_mode);
          display_oth(&st);
          display_time(&st);
          my_printf("%s\n", dir->d_name);
        }
      closedir(d);
      return (0);
    }
    Alors 2 choses, vous vous demanderez probablement pourquoi je n'ai pas verifie la valeur de retour de stat, simplement parcequ'elle me renvoie -1 (son code d'erreur presque tout le temps) alors que l'affichage sans ce test est parfait (et on en vient au second soucis) UNIQUEMENT dans le dossier courrant.

    Si j'appelle mon programme en lui envoyant comme chemin "." ca marche tres bien, en revanche pas question de lui envoyer un chemin absolue du genre /u/all sans avoir divers problemes :
    -le code de retour est toujours negatif malgre l'affichage a peu pres correct si on le passe outre.
    -certaines des infos, comme le poids et le nombre de liens sont erronees sur un chemin absolue et je ne comprends pas pourquoi.

    Voila une fois de plus je ne demande aucun code mais simplement un explication theorique sur comment marche stat plus precisement et pourquoi il ne marche pas sur un repertoire distant.

    Cordialement.

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Il y a deux solutions. Soit tu passes à stat() le chemin issus de la concaténation de argv[1] et de dir->d_name, soit tu changes le répertoire de travail courant avec chdir() avant d'appeler stat(). Voici un exemple utilisant la seconde solution:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dirent.h>
     
    int main(int argc, char **argv)
    {
        if (argc == 2)
        {
            DIR           *d;
            struct stat   st;
            struct dirent *dir;
            char start_wd[128] = "";
     
            /* -tc- on memorise le repertoire de travail courant */
            if (getcwd(start_wd, sizeof start_wd) == NULL)
            {
                perror("getcwd() error");
                /* -tc- je n'aime pas les return sauvages, mais comme c'est la
                   strategie de gestion d'erreur que tu a utilisee... N'oublie pas
                   cependant que les 3 seules valeurs portables que peut renvoyer
                   main() sont 0, EXIT_SUCCESS et EXIT_FAILURE */
                return EXIT_FAILURE;
            }
     
            d = opendir(argv[1]);
            if (d == NULL)
            {
                perror("opendir() error");
                return EXIT_FAILURE;
            }
     
            /* -tc- on change le repertoire de travail */
            chdir(argv[1]);
     
            while ((dir = readdir(d)))
            {
                if (stat(dir->d_name, &st) == -1)
                {
                    perror("stat() error");
                    return EXIT_FAILURE;
                }
                /* -tc- fonctions d'affichages... */
                printf("%s\n", dir->d_name);
            }
            /* -tc- on restitute le repertoire de travail de depart */
            chdir(start_wd);
            closedir(d);
        }
     
        return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 46
    Par défaut
    Effectivement il faut que j'arretes de boire je crois =)
    Il est evident que si j'envoies à stat uniquement d_name il ne sais pas dans quel repertoire le fichier se trouve...

    Je ne sais pas pourquoi j'ai pensé que le chemin était modifié par (magie ?), bref merci pour ces explications et désolé pour le return de -1 je ne pensais pas que cela posait problème dans le main, ou en tout les cas n'était pas conventionel.

    Cordialement.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    N'oublie pas

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CKEditor] chemin absolu sur les images
    Par elcoyotos dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 06/10/2009, 12h39
  2. Chemin absolu d'un photo que j'ai mis sur le cd-rom
    Par mihaispr dans le forum MATLAB
    Réponses: 1
    Dernier message: 21/05/2009, 11h03
  3. Réponses: 2
    Dernier message: 10/08/2007, 15h05
  4. Lecteur réseau, chemin absolu sur le serveur
    Par Tunka dans le forum Windows
    Réponses: 1
    Dernier message: 03/10/2006, 13h51
  5. Lecteur réseau, chemin absolu sur le serveur
    Par Tunka dans le forum Delphi
    Réponses: 1
    Dernier message: 02/10/2006, 13h39

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