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 :

Eviter 2 ouvertures


Sujet :

C

  1. #1
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 841
    Par défaut Eviter 2 ouvertures
    Bonjour,

    Existe-t-il un moyen pour savoir si un fichier stream est ouvert?

    Si j'ai le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FILE *st1,*st2;
    st1=fopen("test.txt","wb");
    st2=fopen("test.txt","r");
    if(st1!=NULL && st2!=NULL) printf("Les deux sont ouverts");
    me donne bien le message Les deux sont ouverts.

    Et je voudrais que si test.txt est déjà ouvert, il soit impossible de l'ouvrir à nouveau (mais est-ce réalisable?)

    Je n'ai rien trouvé dans la FAQ à ce sujet.

    Merci de m'apporter vos lumières.

    Edgar.

  2. #2
    Membre éclairé Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    Février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 43
    Par défaut
    Bonjour,

    pour résoudre ton problème le plus simple me semble d'écrire une fonction permettant d'ouvrir ton fichier.
    Une variable globale te permettra de savoir si le fichier est déjà ouvert.
    Si c'est le cas, le fichier n'est pas ouvert une deuxième fois mais c'est le pointeur sur le stream qui est retourné.

    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
    static FILE *gFile = NULL;
     
    FILE* openTestFile(void)
    {
        /* Si le fichier n'est pas déjà ouvert */
        if (NULL == gFile)
        {
            /* Ouvre le fichier */
            gFile = fopen("test.txt","wb");
        }
     
        /* Retourne le pointeur sur le stream */
        return gFile;
    }
     
    void closeTestFile(void)
    {
        if (NULL != gFile)
        {
            fclose(gFile);
            gFile = NULL;
        }
    }
     
    void main(void)
    {
        FILE* st1 = openTestFile(); /* Ouverture du fichier */
        FILE* st2 = openTestFile(); /* Le fichier est déjà ouvert => st2 == st1 */
    }
    A+

  3. #3
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    Pour résoudre le problème il suffit d'initialiser les variables, non ???

    Citation Envoyé par edgarjacobs Voir le message
    Et je voudrais que si test.txt est déjà ouvert, il soit impossible de l'ouvrir à nouveau (mais est-ce réalisable?)
    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
     
    FILE *st1=NULL,*st2=NULL;
    ...
    if(st1!=NULL )
    {
    ...
    }
    else
     st2 = fopen(...);
     
    if ( st2!=NULL)
    {
    ...
    }
    else
     st2 = fopen(...);

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Tu veux qu'on ne puisse pas ouvrir le fichier s'il est déjà ouvert une fois :
    - dans ton processus ?
    - dans un groupe de processus?
    - sur ton ordi (ex : image ouverte avec paint, impossible de l'ouvrir avec ton logiciel)

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Citation Envoyé par edgarjacobs Voir le message
    Et je voudrais que si test.txt est déjà ouvert, il soit impossible de l'ouvrir à nouveau (mais est-ce réalisable?)
    Cela depend de ton systeme d'exploitation. Pour les Unix et les Linux, tu ne peux pas empecher l'ouverture d'un fichier (sauf OS specifique type Trusted Solaris). Si un fichier est ouvert deux fois, c'est le dernier qui ecrit qui a raison (ecrasement du contenu).

    Pour Windows, je ne connais pas le comportement par defaut, a supposer qu'il soit le meme pour toutes les versions.

    Ce qui est possible : interdire l'ouverture du fichier au sein de ton programme, voir au sein de tous les programmes que tu maintiens. Pour cela, il te suffit d'implementer un systeme de lock plus ou moins puissant, selon les besoins.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 841
    Par défaut
    Merci à tous pour vos réponses. Dans l'exemple que j'ai donné, oui, il est facile d'éviter une double ouverture, mais c'était juste pour vérifier que windows (puisque c'est de lui qu'il s'agit) permet bien l'ouverture simultanée d'un même fichier plusieurs fois. J'avais naïvement pensé que, puisqu'il était ouvert en écriture, je ne pourrais pas l'ouvrir en lecture tant que le fichier n'aurait pas été fermé.

    Je pense que le plus simple, à la lecture de vos suggestions et questions, va être de récupérer le path complet du fichier, et d'implémenter un simple système de lock/unlock.

    Si quelqu'un a une suggestion sur la manière de s'y prendre... je suis preneur.

    Déjà merci à tous,

    Edgar.

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    salut !

    sous windows (mingw et tcc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    .
    .
     
    	FILE * f;
    .
    .
            if (f->flag)
                 //le fichier est ouvert
            else
                 //le fichier n'est pas ouvert.
    A+

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    un petit complément : la structure pointée par f n'est pas initialisée avant la première ouverture du fichier. de plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*
     * The structure underlying the FILE type.
     *
     * I still believe that nobody in their right mind should make use of the
     * internals of this structure. Provided by Pedro A. Aranda Gutiirrez
     * <paag@tid.es>.
     */
    dans le header stdio.h.

    la meilleure solution reste donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FILE * f = NULL;//à la définition
    .
    .
    fclose(f);
    f = NULL;//à chaque fermeture
    .
    .
    if (f)
            //le fichier est ouvert
    else
            //le fichier n'est pas ouvert
    A+

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 568
    Par défaut
    On rappelle quand même que si les mandatory locks ne sont pas disponibles par défaut sous Unix (on peut les activer explicitement en montant certains systèmes de fichiers sous Linux), les « verrous consultatifs », eux, existent depuis le départ et sont standards :

    Voir :

    flock();
    lockf();
    fcntl();

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut @Obsidian
    Voir :

    flock();
    lockf();
    fcntl();
    pas de chance pour edgarjacobs : il travaille sous windows et aucune de ces fonctions ne sont dans des libraries standard.

    A+

  11. #11
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par anacharsis Voir le message
    pas de chance pour edgarjacobs : il travaille sous windows et aucune de ces fonctions ne sont dans des libraries standard.
    POSIX est considere comme un standard. Le fait que Microsoft ait decide de ne pas l'implementer ne lui enleve pas ce titre.

    Ceci dit, je pense que suffisamment de solutions ont ete proposees ici pour trouver une solution tout a fait acceptable.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  12. #12
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 841
    Par défaut
    Un grand merci à tous.

    Le plus 'simple', et sans doute le plus efficace pour gérer ces mulitples ouvertures, va sans doute être d'écrire deux fonctions, une fileOpen et une fileClose, remplaçant fopen et fclose. Et de gérer en mémoire une table des fichier ouverts, retenant le type d'ouverture, de manière à permettre des fread concurrents, mais des les interdire si un fichier est ouvert en écriture. De même, ça empêchera d'ouvrir un fichier en écriture si il est déjà ouvert. Ce ne sont pas les quelques K grignotés sur la mémoire qui vont poser problème, le nombre maximum de fichiers pouvant être ouvert simultanément étant connu.

    Encore merci à tous

    Edgar.

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Je te conseillerais de regarder les sémaphore lecteur/rédacteur si tu compte avoir plusieurs processus.

    Ils permettent à plusieurs processus d'accéder à une ressource en lecture sauf quand elle est déjà utilisée en écriture.
    Ils permettent aussi à un seul processus à la fois d'accéder à une ressources en écriture .

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Et de gérer en mémoire une table des fichier ouverts, retenant le type d'ouverture, de manière à permettre des fread concurrents, mais des les interdire si un fichier est ouvert en écriture.
    J'avais envie de te dire "fais une hash table des fichiers ouverts" mais tu ne travailles pas avec Java. Tu as eu l'idée tout seul en fait : )

  15. #15
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Le plus 'simple', et sans doute le plus efficace pour gérer ces mulitples ouvertures, va sans doute être ...de gérer en mémoire une table des fichier ouverts
    Pourquoi vouloir ré-écrire fopen et fclose ??

    Ce que tu dis là suffit..

  16. #16
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Il n'a jamais dit qu'il allait réécrire les fonctions fclose et fopen.

    Il a juste dit qu'il allait mettre des fonctions (fileOpen, fileClose) remplaçant fclose et fopen, le but étant de gérer à la fois l'ouverture/fermeture des fichiers mais aussi de gérer l'autorisation d'accès au fichier.

    Rien ne l'empêche donc d'avoir dans fileOpen un fopen et dans fileClose un fclose
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    FILE * fileOpen(const char *chemin, const char *mode_ouverture)
    {
                 if(acces_fichier)
                 {
                                  return fopen(chemin, mode_ouverture);
                  }
                  else
                  {
                                   return NULL;
                                   //ou s'endors
                                   //puis ouvre le fichier une fois qu'il est disponible
                   }
    }

  17. #17
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 841
    Par défaut
    Envoyé par Neckara
    Il a juste dit qu'il allait mettre des fonctions (fileOpen, fileClose) remplaçant fclose et fopen, le but étant de gérer à la fois l'ouverture/fermeture des fichiers mais aussi de gérer l'autorisation d'accès au fichier.
    C'est exactement ça, faire une interface dans laquelle fopen sera appelée si nécessaire, et qui décidera si oui ou non l'appelant peut avoir accès au fichier (pour fileOpen). De même, filecClose ne fermera physiquement le fichier en appelant fclose, que si le demandeur est le dernier à appeler la fonction (il suffit d'un simple compteur pour savoir quel est le nombre d'ouverture/fermeture réalisées).

    Envoyé par Neckara
    Je te conseillerais de regarder les sémaphore lecteur/rédacteur si tu compte avoir plusieurs processus.
    Merci, Je vais y jeter un oeil.

    Merci à tous.

    Edgar.

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

Discussions similaires

  1. [XL-2002] Eviter ouverture Invite commande
    Par vaucluseimmo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2010, 17h35
  2. [MySQL] Eviter l'execution d'une requete à l'ouverture de la page
    Par lolodelp dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/04/2008, 11h46
  3. Eviter le calcul du tcd à l'ouverture
    Par benoitbs dans le forum Excel
    Réponses: 4
    Dernier message: 28/01/2008, 11h01
  4. Réponses: 0
    Dernier message: 11/12/2007, 20h23
  5. Eviter le téléchargement d'un fichier à chaque ouverture
    Par Mut dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/09/2007, 16h44

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