Partage
  • Partager sur Facebook
  • Partager sur Twitter

[fstream] recuperer l'etat d'un fichier sans l'ouvrir

Sujet résolu
    10 juillet 2007 à 12:11:51

    Bonjour

    je cherche un moyen de verifier en cours d'execution que je n'ai pas déjà une autre instance de mon programme ouverte
    jusqu'à present, j'utilise le contenu d'un fichier, s'il est à 1, c'est donc qu'il est déjà ouvert, à 0 on peut en ouvrir un autre
    à l'execution du programme, on le fait passer à 1, et on le remet à 0 lors de la fermeture du programme
    c'est bien, mais pas top...
    en effet, lors d'un plantage, on ne passe pas forcement par l'instruction qui demande de remettre la valeur du fichier à 0 (meme si j'ai blindé toutes les portes de sortie du programme, sous windows, nous ne sommes jamais à l'abri d'un plantage)

    j'ai donc décidé d'utiliser encore un fichier, et de tester s'il est déjà ouvert par un autre programme
    mais je n'arrive pas à trouver un moyen de declarer mon fichier qui ne me fasse pas une ouverture

    exemple:

    // fstream::is_open
    #include <iostream>
    #include <fstream>
    using namespace std;

    int main () {

      fstream filestr;
      filestr.open ("test.txt");
      if (filestr.is_open())
      {
        cout << "File successfully open";
        filestr.close();
      }
      else
      {
        cout << "Error opening file";
      }
      return 0;
    }
     


    je n'ai pas trouvé de moyen de specifier le nom de mon fichier sans l'ouvrir en meme temps
    donc pour verifier qu'il est déjà ouvert, c'est pas terrible
    si au moins j'avais une valeur de retour de la fonction open en cas d'erreur (ce qui voudrait dire si je n'ai pas pu ouvrir le fichier, c'est qu'il est déjà ouvert), ça pourrait aller, mais il n'y a pas de retour...


    je sollicite donc votre aide pour m'indiquer un moyen de recuperer la propriété is_open() d'un fichier, sans pour autant l'ouvrir

    D'avance merci

    Cordialement
    Nigel
    • Partager sur Facebook
    • Partager sur Twitter
      10 juillet 2007 à 13:10:20

      Citation : Nigel

      je cherche un moyen de vérifier en cours d'exécution que je n'ai pas déjà une autre instance de mon programme ouverte



      Si j'ai bien compris, tu veux pas qu'on puisse lancer ton programme 2 fois en même temps. Tiens c'est un problème auquel j'avais jamais pensé et là sur le moment je vois pas de solution "propre".

      Je pense que le coup du fichier n'est pas la bonne (ou la meilleure) solution pour faire cela. C'est faisable en utilisant les threads. Mais c'est pas forcément évident.

      L'idée est d'aller voir dans la liste des processus si le processus que tu tentes de lancer existe déjà. Et là tu es sûr que ça fonctionne, car en cas de "plantée" le processus est détruit. Par contre cette méthode a un défaut: Si un autre processus qui n'a rien à voir avec le tien tourne déjà, eh bien tu ne pourras pas lancer ton programme.

      Mais comme je l'ai déjà dit, il est peu-être (et même sûrement) possible de faire autrement.



      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        10 juillet 2007 à 13:45:44

        Petite subtilité
        Si le programme est déjà lancé, la deuxieme instance effectue une autre action

        c'est un lecteur MP3
        la premiere fois, on recupere la playlist, on ajoute des fichiers à la liste si on a fait passer un dossier ou un fichier en parametre, puis on commence la lecture
        si une autre instance est déjà lancée, on ne fait qu'ajouter les nouveaux fichiers en parametre à la playlist, puis ça se ferme.
        Donc il ne faut pas refuser en bloc l'execution du programme, juste verifier dans le corps du programme et on decide de ce qu'on fait en fonction...

        j'espere avoir été clair

        Cordialement,
        Nigel
        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2007 à 13:54:24

          Oui ça ne change rien au problème. Tout le problème est dans la détection d'une autre instance du programme.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            10 juillet 2007 à 14:17:00

            on m'avait parlé de mutex, mais je n'ai pas compris comment ça marchait
            et si je peux eviter l'attente active, c'est mieux
            c'est tout de meme une application sensée etre assez legere en terme d'utilisation processeur (pour la memoire, c'est moins au point, mais c'est acceptable)

            Cordialement,
            Nigel
            • Partager sur Facebook
            • Partager sur Twitter
              10 juillet 2007 à 14:54:25

              Exactement les mutex c'est ce à quoi je pensais.


              #include <mutex>
              #include <string>

              int main(blabla)
              {
              bool existePasEncore;
              string ID = "Une chaine de caractere unique";

              mutex instanceCourante =  new mutex(true,ID,existePasEncore); //On crée le mutex

              if(existePasEncore)
              {
                  //Ici appel de la fonction qui lance le programme si il y a pas d'instance
                 
                 instanceCourante.ReleaseMutex();   //On détruit le mutex a la fin du programme

              } else{

                 //Ici appel de la fonction qui lance le programme a exécuter si une instance tourne déjà
              }

              return 0;
              }

              Pour plus de détails, je te renvoie à la documentation MSDN de Microsoft.


               
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                10 juillet 2007 à 16:21:13

                Merci beaucoup Nanoc
                Je vais faire une petite recherche sur MSDN pour voir comment le faire un peu differemment (je developpe surtout en C, mais j'utilise certaines librairies C++, oui, je sais, c'est mal) mais ton exemple m'explique tout de meme comment ça marche
                J'avais trouvé que les articles de la wikipedia traitant ce sujet etaient illisibles (je suis nul quand il est question de lire des docs ou des articles un peu trop abstraits ou techniques)
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juillet 2007 à 22:30:50

                  *nix -> man flock si tu reposes sur des fichiers, je soupçonne qu'il y a d'autres façons plus propres.

                  windows -> aucune idée.

                  De temps en temps, je vois passer des "comment écrire des services?" ou "comment avoir des programmes mono-instance?" sur developpez. (poser/chercher la question dans le forum de ton OS et ni dans C, ni dans C++)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                  [fstream] recuperer l'etat d'un fichier sans l'ouvrir

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown