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 :

Information sur des fichiers


Sujet :

C

  1. #41
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut
    c'est deux elements de la tructure data:

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par melmouj
    c'est deux elements de la tructure data:
    Ok, alors maintenant, tu peux écrire le code...

    (merci d'utiliser le bouton [Citer])

  3. #43
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut
    Bonjour,

    voila j'ai fait ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    int compar_size(const void * pt_a, const void * pt_b) 
    { 
      const struct data * pt_da=pt_a;
      const struct data * pt_db=pt_b;
     
      return pt_da->sbuf.st_size - pt_db->sbuf.st_size;
     
    }

    mais n'affiche pas la meme chose que dir (ls sous unix)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par melmouj
    Bonjour,

    voila j'ai fait ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    int compar_size(const void * pt_a, const void * pt_b) 
    { 
      const struct data * pt_da=pt_a;
      const struct data * pt_db=pt_b;
     
      return pt_da->sbuf.st_size - pt_db->sbuf.st_size;
     
    }
    Correct, mais il faut aussi voir l'appel de qsort().
    mais n'affiche pas la meme chose que dir (ls sous unix)
    "Pas la même chose", c'est vachement clair... on est censé deviner ?

  5. #45
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    mais n'affiche pas la meme chose que dir (ls sous unix)
    "Pas la même chose", c'est vachement clair... on est censé deviner ?
    ce que je veux dire que les fichiers ne correspondaient aux tailles
    çàd la taille d'un fichier x correspond à un fichier y.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    if(!err)
       {
         qsort(p_data, nbr, sizeof *p_data, compar_size);
         for(...)
    .............

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par melmouj
    Citation Envoyé par Emmanuel Delahaye
    mais n'affiche pas la meme chose que dir (ls sous unix)
    "Pas la même chose", c'est vachement clair... on est censé deviner ?
    ce que je veux dire que les fichiers ne correspondaient aux tailles
    çàd la taille d'un fichier x correspond à un fichier y.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    if(!err)
       {
         qsort(p_data, nbr, sizeof *p_data, compar_size);
         for(...)
    .............
    Il faudrait voir l'ensemble du code...

  7. #47
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut
    voila 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
    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
     
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <unistd.h>
    #include <strings.h>
    #define FMT_TIME "%Y%m%d-%T"
    #define Max 1000
    struct data
    {
       struct stat sbuf;
       char *file_name;
    };
     
    int compar_size(const void * pt_a, const void * pt_b)
    {
      const struct data * pt_da=pt_a;
      const struct data * pt_db=pt_b;
     
      return pt_da->sbuf.st_size - pt_db->sbuf.st_size; 
    }
    int main (int argc, char *argv[])
    {
      int i, mode;
      int nbr=argc - 1;
      char * patch=NULL;
      char date1[Max];
      char date2[Max];
      char date3[Max];
     
      struct data *p_data = malloc (nbr * sizeof * p_data);
     
      if (p_data != NULL)
      {
       int result=0;
     
       for(i=0; !result && i < nbr; i++)
       {
         result=stat(argv[i+1], &p_data[i].sbuf);
         p_data[i].file_name =  argv[i + 1];
       }
       if(!result)
       {
         qsort(p_data, nbr, sizeof *p_data, compar_size);
         for(i=0; i <nbr; i++)
         { 
           mode=p_data[i].sbuf.st_mode; 
           patch=argv[i]; 
                strftime (date1,sizeof date1,FMT_TIME, gmtime (&p_data[i].sbuf.st_mtime));
                strftime (date2,sizeof date2,FMT_TIME, gmtime (&p_data[i].sbuf.st_atime));
                strftime (date3,sizeof date3,FMT_TIME, gmtime (&p_data[i].sbuf.st_ctime));
     
                if(S_ISDIR (mode))
                {              
                     printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[i].sbuf.st_size, date1,date2, date3, patch);
                }
                //if(S_ISLNK(mode)) printf("%s S File size %ld\n", argv[i],
                if(S_ISREG (mode))
                {
                     printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[i].sbuf.st_size, date1,date2, date3, patch);
                }
              }           
            }
            else
            {
              printf("Problem getting information\n");
              perror(argv[i+1]);
            } 
            free(p_data), p_data=NULL;
       }      
      return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par melmouj
    voila le code :<...>
    Ok. Le problème est dans l'affichage. Tu t'obstines à afficher ce qu'il y a dans la ligne de commande, alors qu'il faut afficher le nom de fichier qui est dans le le tableau.

    Tu n'as donc pas compris pourquoi on avait ajouté le nom du fichier dans la structure... C'est désespérant...
    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
     
    /* POSIX.1 */
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
     
    /* ISO C */
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <assert.h>
     
    #define FMT_TIME "%Y%m%d-%T"
    #define Max 1000
     
    struct data
    {
        struct stat sbuf;
        char *file_name;
    };
     
    static int compar_size(const void * pt_a, const void * pt_b)
    {
        const struct data * pt_da=pt_a;
        const struct data * pt_db=pt_b;
     
        return pt_da->sbuf.st_size - pt_db->sbuf.st_size;
    }
     
    static void display(struct data const *p_data, int nbr)
    {
        int j;
        for(j=0; j <nbr; j++)
        {
            int mode=p_data[j].sbuf.st_mode;
            char * patch=p_data[j].file_name;
            char date1[Max];
            char date2[Max];
            char date3[Max];
     
            strftime (date1,sizeof date1,FMT_TIME, gmtime (&p_data[j].sbuf.st_mtime));
            strftime (date2,sizeof date2,FMT_TIME, gmtime (&p_data[j].sbuf.st_atime));
            strftime (date3,sizeof date3,FMT_TIME, gmtime (&p_data[j].sbuf.st_ctime));
     
            if(S_ISDIR (mode))
            {
                printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[j].sbuf.st_size, date1,date2, date3, patch);
            }
     
            //if(S_ISLNK(mode)) printf("%s S File size %ld\n", argv[j],
            if(S_ISREG (mode))
            {
                printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[j].sbuf.st_size, date1,date2, date3, patch);
            }
        }
    }
     
     
    int main (int argc, char *argv[])
    {
        int nbr=argc - 1;
     
        if (nbr != 0)
        {
            struct data *p_data = malloc (nbr * sizeof * p_data);
     
            if (p_data != NULL)
            {
                int result=0;
                {
                    int i;
     
                    for(i=0; !result && i < nbr; i++)
                    {
                        result=stat(argv[i+1], &p_data[i].sbuf);
                        p_data[i].file_name =  argv[i + 1];
                    }
     
                    if(!result)
                    {
                        display(p_data, nbr);
                        puts("");
                        qsort(p_data, nbr, sizeof *p_data, compar_size);
                        display(p_data, nbr);
                        puts("");
                    }
                    else
                    {
                        printf("Problem getting information\n");
                        perror(argv[i+1]);
                    }
                }
                free(p_data), p_data=NULL;
            }
            assert (p_data == NULL);
        }
        else
        {
            printf ("pas de parametres\n");
        }
        return 0;
    }

  9. #49
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut
    Merci Emmanuel
    si j'ai compris prq on a ajouté le nom de fichier ds la structure.

    tu as raison c'est un probleme d'affichage,
    il faut que j'affiche la taille et le nom de fichier qui est ds le tableau
    (sinon je continue à afficher le nom du fichier avec la liste donnée par le shell dans argv)

    enfin c'est bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[i].sbuf.st_size, date1,date2, date3, p_data[i].file_name);

  10. #50
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut
    Bonjour

    encore moi, j'ai une petite question:

    dans le cas ou il ya 200000 parametres (càd le cas d'un repertoire qui contient 200000 fichiers)

    j'ai ce petit message

    arg list toot long (càd trop de paramétres)

    si quelqu'un à une idée

    Merci

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par melmouj
    Bonjour

    encore moi, j'ai une petite question:

    dans le cas ou il ya 200000 parametres (càd le cas d'un repertoire qui contient 200000 fichiers)

    j'ai ce petit message

    arg list toot long (càd trop de paramétres)

    si quelqu'un à une idée
    Ben oui, l'expansion de '*' par le système a ses limites... L'idée est de passer un paramètre genre "*.c", et de l'utiliser avec les fonctions de lecture de répértoire les plus standards possibles (POSIX.1) comme opendir(), readdir() etc... de nombreux exemples ont déjà été postés...

    Pour aller plus loin, la lecture récursive est assez 'tricky', mais c'est un interessant exercice de reflexion...

    Commence par une lecture simple d'un répertoire (rappel : le répertoire courant est "." sur la plupart des systèmes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       ... = opendir(...)
     
       while (readdir(...) != NULL)
       {
          ...
       }

  12. #52
    Membre confirmé
    Inscrit en
    Novembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 166
    Par défaut information fichier
    voila

    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
     
    int main (int argc, char *argv[]) 
    { 
     
        DIR *rep=opendir(".");
        if (rep != NULL)
        {
        	struct dirent *dir;
        	while ((dir=readdir(rep)) != NULL)
        	{
        	  printf("%s\n", dir->d_name);
        	}
     
        	closedir(rep), rep=NULL;
     
        }	
     
    ..................
     
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: information fichier
    Citation Envoyé par melmouj
    voila
    Un peu incomplet, mais ok.
    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
     
    #include <dir.h>
    #include <dirent.h>
     
    #include <stdio.h>
     
    int main (int argc, char *argv[])
    {
       DIR *rep = opendir (".");
     
       if (rep != NULL)
       {
          struct dirent *dir;
     
          while ((dir = readdir (rep)) != NULL)
          {
             printf ("%s\n", dir->d_name);
          }
     
          closedir (rep), rep = NULL;
       }
       return 0;
    }

Discussions similaires

  1. Obtenir des informations sur un fichier
    Par stalacta dans le forum Général Python
    Réponses: 8
    Dernier message: 25/01/2014, 10h55
  2. Sortie des informations sur un fichier
    Par ayoubnour dans le forum Langage
    Réponses: 5
    Dernier message: 15/06/2009, 09h00
  3. Obtenir des informations sur un fichier
    Par Just dans le forum Langage
    Réponses: 1
    Dernier message: 19/02/2008, 10h42
  4. Réponses: 8
    Dernier message: 13/07/2006, 01h17
  5. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

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