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 :

Ouverture de fichiers avec un nom en partie inconnu


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut Ouverture de fichiers avec un nom en partie inconnu
    Bonjour à tous,

    J'aimerai pouvoir ouvrir et lire le contenu de fichiers dont une partie du path est inconnu
    Je m'explique, je connais le chemin qui même aux fichiers

    /var/run/

    Je connais une partie du nom du fichier, ce qui me permet de les distinguer

    appli_*.pid -> * représente ce que je ne connais pas

    Et je connais le nombre max de fichiers possible 9
    Malheureusement * est une chaîne de caractère de moins de 10 caractères aléatoire

    Il est possible de faire quelque chose avec ça ? Je sèche

    Merci d'avance

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    353
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 353
    Points : 573
    Points
    573
    Par défaut
    A la première lecture, je dirais :
    Il faut lister les fichiers du répertoires (cf dirent.h & co).
    Faire une comparaison entre les éléments du listing et le fichier que tu cherches sur les n premiers caractères (strncmp).

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Tu peux retrouver tous les fichiers en utilisant les fonctions findfirst() et findnext(), incluses dans dir.h

    Voici un petit exemple avec tes données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int done,found=0;
    struct ffblk f;
     
    done=findfirst("var\\run\\appli_*.pid",&f,FA_ARCH|FA_RDONLY);
    while(!done && !found) {
      if(stricmp(f.ff_name,MON_FICHIER)==0) found=1;
      else done=findnext(&f);
    }
    findclose(&f);
    La structure ffblk et les flags FA_xxx sont décrits dans dir.h
    findfirst() et findnext() renvoient 0 tant qu'il y un fichier qui correspond à tes critères.

    Amicalement,

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour vos réponses, j'aurai appris plein de trucs

    Seulement j'ai oublié une info importante je suis sous Linux et findfirst ne fonctionne que sous windows, il faut donc que je trouve l'équivalent

    Merci encore

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Grâce à vos indications j'ai trouvé l'équivalent sous linux

    Le code suivant m'affiche la liste des fichiers

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <errno.h>
     
    int main( void ) {
            DIR *currentDir,
                    *type;
            struct dirent *fichier;
     
            if( NULL == ( currentDir = opendir( "/var/run" ))) {
                    perror( "opendir()" );
            } else {
                    while( NULL != ( fichier = readdir( currentDir ))) {
                            printf( "%s", fichier->d_name );
                            printf( "\n" );
                            if( NULL == ( type = opendir( fichier->d_name ))) {
                            }
                            closedir( type );
                    }
                    if( errno != 22 ) {
                            perror( "readdir()" );
                    }
     
                    closedir( currentDir );
            }
     
            return 0;
    }
    Il ne reste plus qu'à faire un tri, effectivement peut-être avec strncmp

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stealth Voir le message
    Grâce à vos indications j'ai trouvé l'équivalent sous linux

    Le code suivant m'affiche la liste des fichiers


    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <errno.h>

    int main( void ) {
    DIR *currentDir,
    *type;
    struct dirent *fichier;

    if( NULL == ( currentDir = opendir( "/var/run" ))) {
    perror( "opendir()" );
    } else {
    while( NULL != ( fichier = readdir( currentDir ))) {
    printf( "%s", fichier->d_name );
    printf( "\n" );
    if( NULL == ( type = opendir( fichier->d_name ))) {
    }
    closedir( type );
    }
    if( errno != 22 ) {
    perror( "readdir()" );
    }

    closedir( currentDir );
    }

    return 0;
    }

    Il ne reste plus qu'à faire un tri, effectivement peut-être avec strncmp


    Salut

    Pourquoi tu fais ce test errno avec 22 ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Pourquoi est-ce que tu essaies d'ouvrir ton fichier ligne 18 ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    J'ai posté un peu vite le bout de code qui fonctionnait

    Sve@r -> oui c'était dans un exemple vu sur le net, sert à rien dans mon cas

    Je posterai la semaine prochaine le code final, je ne l'ai pas sous la main

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stealth Voir le message
    Sve@r -> oui c'était dans un exemple vu sur le net, sert à rien dans mon cas
    En fait, ma question concernait surtout la signification de ce nombre "22"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    En fait, ma question concernait surtout la signification de ce nombre "22"...
    22, il me semble que c'est la valeur EINVAL (invalid parameters). Mais je ne vois pas vraiment ce que cela vient faire là-dedans.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    22, il me semble que c'est la valeur EINVAL (invalid parameters). Mais je ne vois pas vraiment ce que cela vient faire là-dedans.
    Oui 22 correspond à EINVAL. J'ai coupé dans un source vu sur le net, le code était plus long, je reconnais que je ne vois pas à quoi il peut servir

    Edit:Zut j’oubliais l'essentiel Bonne Année !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Voila je l'ai extrait j'espère avoir gardé l'essentiel

    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
     
                            DIR *currentDir;
                            struct dirent *fichier;
     
                            if( NULL == ( currentDir = opendir(PidDir))) {
                                    perror( "opendir()" );
                                    } else {
                                    while( NULL != ( fichier = readdir( currentDir ))) {
    /* Je vais une comparaison des 6 premiers caracteres entre le fichier trouvé et ce qui doit être trouvé */
                                            if(!strncmp(namepid, fichier->d_name, 6) ){
    /* statemp2 variable  temporaire  = PidDir = le rep dans lequel je fais ma recherche (/var/run/) */
                                                    strcpy(statetemp2,PidDir);
    /* J'essaye d'ouvrir le fichier avec le nom complet chemin+nom */
                                                    strcat(statetemp2,fichier->d_name);
                                                    if ((f = fopen(statetemp2, "rb")) != NULL){
                                                            fgets(buff, sizeof(buff), f);
                                                            fclose(f);
        /* Ce que vous voulez faire avec le fichier ci */
                                                           statetemp2[0]='\0';
                                                    }
                                            }
                                    }
                                    }
                            }

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    353
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 353
    Points : 573
    Points
    573
    Par défaut
    attention à atoi, il faut utiliser strtol à la place

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par _-Slash-_ Voir le message
    attention à atoi, il faut utiliser strtol à la place

    Merci d'ailleurs je le vire il n'a rien à faire dans mon exemple

  15. #15
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Pas grand chose à redire, en espérant simplement que statement2 soit suffisamment grand pour stocker les noms de fichiers. Sinon, tu ne gères pas le cas où un fichier commence par appli_ suivi d'une suite complètement aléatoire. Bon, c'est peut-être inutile, mais bon...
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

Discussions similaires

  1. Ouverture de fichier avec nom dans une autre langue
    Par bannik dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2015, 15h00
  2. Ouverture de fichier avec début de nom
    Par bbell dans le forum VBScript
    Réponses: 8
    Dernier message: 11/12/2012, 16h33
  3. Ouverture d'un fichier avec un nom variable
    Par setauh dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/09/2009, 07h19
  4. Ouverture d'un fichier avec son nom
    Par bonjour69 dans le forum C
    Réponses: 23
    Dernier message: 15/10/2005, 19h36
  5. Aide sur ouverture de fichier avec access
    Par FusionR dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 17/06/2004, 12h02

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