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 confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 éprouvé
    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
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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

  4. #4
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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 ??

  7. #7
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    C'est pour quel système? est ce que la portabilité est importante?

  9. #9
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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...

  11. #11
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    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?

  13. #13
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    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.

  15. #15
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    tu avais autre chose à proposer ?
    Oui mais non portable alors...

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

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par floopi51 Voir le message
    et c'était quoi ?
    inotify : http://julp.developpez.com/linux/inotify/

  19. #19
    Membre confirmé Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    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?

+ 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