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 :

"scanner" un repertoire


Sujet :

C

  1. #1
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut "scanner" un repertoire
    Bonjour,

    j'ai une application qui sauvegarde des fichiers toutes les 5 secondes dans un repertoire.
    Je veux ecrire un programme qui reste en "écoute" sur ce repertoire et recupere en continu les noms des fichiers du repertoire pour les traiter.
    Pour eviter que le programme ne boucle en continu en cas d'absence de fichier dans le repertoire, je veux mettre un timer à 60s.

    J'ai écris ce bout de code mais cela ne fonctionne pas. La fonction readdir recupere les noms des fichiers qui sont presents dans le repertoire au démarrage mais si j'ajoute des fichiers pendant l'execution, ils ne sont pas vus.

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <dirent.h>
     
    #define PATH "/home/cache"
     
    int
    ispng(char *file) {
      char tmp[256];
      char* p, *token;
     
      bzero(tmp, 256);
      strcpy(tmp,file);
      token = strtok_r(tmp,".",&p);
     
      fprintf(stderr,"tmp=<%s>, token=<%s>, p=<%s>\n",tmp,token,p);
      if(strcmp(p,"png") == 0) {
        return 0;
      } else {
        return 1;
      }
    }
     
    int 
    main() {
      int rc=0;
      DIR* dir=NULL;
      struct dirent * ent;
      time_t debut,fin,t;
      char fileIn[256]=PATH;
      char tmp[256];  
      int chrono=0;
     
      /* ouverture du repertoire ou arrive les captures d'écran */
      dir = opendir(PATH);
      debut = time(&t);
     
      while(dir != NULL) {
        while((ent = readdir(dir)) != NULL) {
          if(ispng(ent->d_name) == 0) {
    	strcat(fileIn,ent->d_name);
    	strcpy(tmp, ent->d_name);
    	fprintf(stderr,"fileIn=<%s> tmp=<%s>\n",fileIn,tmp); 
          }
        }
     
     
        fin = time(&t);
        chrono = fin - debut;
        if(chrono > 60) {
          exit(0);
        }
      }
      return 0;
    }
    des idées, des suggestions, des remarques ?

    merci

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Points : 169
    Points
    169
    Par défaut
    Pour le "timer" tu peux utiliser les fonctions :

    Sleep(), sleep() et usleep();

    L'un en seconde, l'aurte milliseconde et le dernier en microS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if(chrono > 60) {
          exit(0);
        }
    Ceci va quitter totalement ton programme. Es-tu sur que c'est ce que tu veux faire ?

  3. #3
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    J'ai écris ce bout de code mais cela ne fonctionne pas. La fonction readdir recupere les noms des fichiers qui sont presents dans le repertoire au démarrage mais si j'ajoute des fichiers pendant l'execution, ils ne sont pas vus.
    En dehors de la remarque ci-dessus, faire un closedir avant un opendir (pas la première fois) est nécessaire.

    Et ton while doit comprendre le couple opendir/closedir
    "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

  4. #4
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par rilou Voir le message
    Pour le "timer" tu peux utiliser les fonctions :

    Sleep(), sleep() et usleep();

    L'un en seconde, l'aurte milliseconde et le dernier en microS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if(chrono > 60) {
          exit(0);
        }
    Ceci va quitter totalement ton programme. Es-tu sur que c'est ce que tu veux faire ?
    oui car d'autre part, dans un cron je vais verifier toutes les heures si le binaire tourne et le relancer si il a stoppé.

    merci.

  5. #5
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    En dehors de la remarque ci-dessus, faire un closedir avant un opendir (pas la première fois) est nécessaire.

    Et ton while doit comprendre le couple opendir/closedir
    J'ai réécrit le code ci-dessous en tenant compte de tes remarques.
    mais dans ce cas, je sors de ma boucle à cause du timer meme si j'ai encore un fichier dans mon repertoire.

    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
     
    int 
    main() {
     
      int rc=0;
      DIR* dir=NULL;
      struct dirent * ent;
      time_t debut,fin,t;
      char fileIn[256]=ORI_PATH;
      char tmp[256];  
      int chrono=0;
      int first = 1;
     
      /* ouverture du repertoire ou arrive les captures d'écran */
      dir = opendir(ORI_PATH);
      debut = time(&t);
     
      while(dir != NULL) {
        if(first != 1) {
          dir = opendir(ORI_PATH);
        }
        while((ent = readdir(dir)) != NULL) {
          if(ispng(ent->d_name) == 0) {
    	strcat(fileIn,ent->d_name);
    	strcpy(tmp, ent->d_name);
    	/*fprintf(stderr,"fileIn=<%s> tmp=<%s>\n",fileIn,tmp); */
          }
          bzero(fileIn,256);
        }
     
        closedir(dir);
        first=0;
     
        fin = time(&t);
        chrono = fin - debut;
        if(chrono > 60) {
          exit(0);
        }
      }
      return 0;
    }

  6. #6
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    euh...

    moi je ferais :

    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
    int 
    main() {
     
      int rc=0;
      DIR* dir=NULL;
      struct dirent * ent;
      time_t debut,fin,t;
      char fileIn[256]=ORI_PATH;
      char tmp[256];  
      int chrono=0;
     
     debut = time(&t);
     
      while( 1 ) {
     
        dir = opendir(ORI_PATH);
        if ( dir == NULL )
           continue ;
     
        while((ent = readdir(dir)) != NULL) {
          if(ispng(ent->d_name) == 0) {
    	strcat(fileIn,ent->d_name);
    	strcpy(tmp, ent->d_name);
    	/*fprintf(stderr,"fileIn=<%s> tmp=<%s>\n",fileIn,tmp); */
          }
          bzero(fileIn,256);
        }
     
        closedir(dir);
     
        fin = time(&t);
        chrono = fin - debut;
        if(chrono > 60) 
           break ;
      }
      return 0;
    }
    PS et c'est quoi ispng ??
    "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

  7. #7
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par souviron34 Voir le message

    PS et c'est quoi ispng ??
    ispng verifie juste si l'extension du fichier lu dans le repertoire est png.
    je traite uniquement les fichiers png.

    effectivement le code est plus clean mais par contre, ce qui fait stopper la boucle c'est le timer et pas l'absence de fichier.

    je voudrai que mon binaire tourne tant qu'il y a des fichiers.
    si il n'y a plus de fichier, je voudrai qu'il stoppe au bout de 60 secondes de boucle dans le vide.

    merci

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    C'est pour quel système? est ce que la portabilité est importante?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    C'est pour quel système? est ce que la portabilité est importante?
    c'est pour faire tourner sur un linux. c'est une debian mais cela peut etre ammene a changer.

    pas de windows donc.

  10. #10
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    ije voudrai que mon binaire tourne tant qu'il y a des fichiers.
    si il n'y a plus de fichier, je voudrai qu'il stoppe au bout de 60 secondes de boucle dans le vide.
    ben c'est pas trop compliqué à modifier, avec le code ci-dessus...
    "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

  11. #11
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    ben c'est pas trop compliqué à modifier, avec le code ci-dessus...
    effectivement, avec le timer deplacé dans la boucle ça fonctionne !

    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
     
    int 
    main() {
     
      int rc=0;
      DIR* dir=NULL;
      struct dirent * ent;
      time_t fin,trouve,t;
      char fileIn[256]=ORI_PATH;
      char tmp[256];  
      int chrono=0;
     
     
     
      while( 1 ) {
     
        dir = opendir(ORI_PATH);
        if ( dir == NULL )
           continue ;
     
        while((ent = readdir(dir)) != NULL) {
          if(ispng(ent->d_name) == 0) {
    	strcat(fileIn,ent->d_name);
    	strcpy(tmp, ent->d_name);
    	/*fprintf(stderr,"fileIn=<%s> tmp=<%s>\n",fileIn,tmp); */
    	trouve = time(&t);
          }
          bzero(fileIn,256);
        }
        closedir(dir);
        fin = time(&t);
        chrono = fin - trouve;
        if(chrono > 60) {
          fprintf(stderr,"chrono=<%d>\n",chrono);
          break ;
        }
      }
      return 0;
    }
    merci

    Floopi

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    c'est pour faire tourner sur un linux. c'est une debian mais cela peut etre ammene a changer.
    A changer pour un linux, ou pour autre chose?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  13. #13
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    A changer pour un linux, ou pour autre chose?
    pour une autre distrib de linux.
    mais c est ok ça fonctionne très bien avec le code posté au dessus.

  14. #14
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    pour une autre distrib de linux.
    mais c est ok ça fonctionne très bien avec le code posté au dessus.
    Comme tu veux.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  15. #15
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Comme tu veux.
    finalement ça ne fonctionne pas.
    dans mon repertoire, il y a 2 sous-répertoires et un ou plusieurs fichiers png, ou pas de fichiers png.
    avec le code tel quel, je ré-ouvre le répertoire à chaque fois et du coup je ne vois que 1 sous répertoire.

    Je teste donc que la structure dirent rendu par readdir n'est pas nulle (elle ne l'est jamais dans mon cas, puisqu'il y a toujours 2 sous repertoire presents) et je teste si j'ai bien un fichier png.

    ça ne fonctionne pas car a chaque readdir, je ne vois qu'un sous-repertoire et je sors.

    voici le code legerement modifié par rapport aux postes précédents :

    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
     
    int 
    main() {
     
      int rc=0;
      DIR* dir=NULL;
      struct dirent * ent;
      time_t fin,trouve,t;
      char fileIn[256]=ORI_PATH;
      char tmp[256];  
      int chrono=0;
     
      trouve = time(&t);
     
      while( 1 ) {
     
        dir = opendir(ORI_PATH);
        if ( dir == NULL )
           continue ;
     
        while(((ent = readdir(dir)) != NULL) && (ispng(ent->d_name) == 0))  {
          strcat(fileIn,ent->d_name);
          strcpy(tmp, ent->d_name);
          /*fprintf(stderr,"fileIn=<%s> tmp=<%s>\n",fileIn,tmp); */
          trouve = time(&t);
          bzero(fileIn,256);
        }
        closedir(dir);
        fin = time(&t);
        chrono = fin - trouve;
        if(chrono > 60) {
          fprintf(stderr,"chrono=<%d>\n",chrono);
          break ;
        }
      }
      return 0;
    }
    tu avais autre chose à proposer ?

    merci

  16. #16
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    tu avais autre chose à proposer ?
    Oui mais non portable alors...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  17. #17
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Oui mais non portable alors...
    et c'était quoi ?

  18. #18
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    et c'était quoi ?
    inotify : http://julp.developpez.com/linux/inotify/
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  19. #19
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    le soucis c'est que le linux sur lequel tournera mon binaire est celui d'un serveur en hebergemnt, je ne peux pas recomplier le noyau pour activer les options relatives à Inotify.

    je ne sais pas si cela est activé par défaut chez eux.

    je vais tester.
    merci.

  20. #20
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    le soucis c'est que le linux sur lequel tournera mon binaire est celui d'un serveur en hebergemnt, je ne peux pas recomplier le noyau pour activer les options relatives à Inotify.

    je ne sais pas si cela est activé par défaut chez eux.

    je vais tester.
    merci.
    Tu peux au moins récupérer la version du kernel?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

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

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