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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

  4. #4
    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

  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 : 42
    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
    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...

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

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