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

Vue hybride

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 783
    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 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
    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 : 32
    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
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 783
    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 474
    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 474
    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();

+ 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