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 :

Pb lecture fichier - FileSystemWatcher


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut Pb lecture fichier - FileSystemWatcher
    Bonjour,

    j'ai un ptit soucis de lecture de fichier...

    Alors voilà, je vais essayer de vous expliquer en essayant d'être claire...

    Donc, j'ai une appli qui crée un fichier xml
    Ce fichier xml doit être utilisé par 2 autres applis...
    L'appli qui le crée l'utilise pour le convertir dans un autre format, là ça pose pas de soucis
    Une autre appli l'utilise pour afficher son contenu; celle-ci repose sur un objet FileSystemWatcher qui scrute le répertoire pour savoir dès qu'un fichier est créé... Dès que l'appli reçoit l'évènement qu'un fichier a été créé, je fais une ptite boucle pour tenter de l'ouvrir, une fois que c'est bon, je l'ouvre pour de bon afin d'afficher son contenu

    C'est dans cette appli que j'ai des pb
    En fait, l'évènement qu'un nouveau fichier a été créé est lancé 2 fois pour le même
    et à chaque fois, à la 1ère ouverture il manque des données et ça fait planter mon appli...

    comment cela se fait-il donc?
    auriez-vous des idées pour y remedier ?...

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    C'est normal,

    il faut interdire l'accès au fichier dans ta première appli jusqu'à la fin de la création du fichier.

    Le problème est :
    CreateFichier() -> cette commence l'écriture du fichier et commence l'écriture des données dans celui-ci.

    Pendant ce temps, ton autre appli détecte la création de ton fichier et le lit avant même que CreateFichier() se soit terminer. (createFichier correspond à la méthode Close() de ton FileStream).

    C'est un problème de multi-threading ou plutôt multi-process dans ton cas

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    J'avais déjà noter ce problème,
    c'est pourquoi, j'ai fait une ptite boucle pour vérifier que le fichier est bien dispo...

    là, c'est autre chose : quand je le lis, il est pas complet...
    et pourquoi, l'évènement 'create' remonte 2 fois?...
    et la 2e fois, c'est bon...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    je ne me suis pas bien expliquer,
    ta boucle doit certainement contenir le code:
    while(!File.Exist(path));

    mais après cette boucle, le close à pu créer le fichier mais pas terminé son écriture. Si tu veux être sur qu'il soit terminé, faut vérifier la taille ou un truc comme ça ou tout simplement bloquer l'accès à ce fichier.

    Pourquoi create se fait deux fois?
    Regarde avec ton debugger la path du fichier créer, il se peut que le fichier soit créer en deux étapes
    1)Faire un fichier temporaire pour sauvegarde les donnée au fur et à mesure
    2)dupliquer le fichier terminer dans le fichier final.

    J'ai eu ce problème avec des fichier .doc

    Sinon, se serait bien que tu mette en ligne le code de ton évènement create et celui de la création de fichier.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    comment faire pour bloquer l'accès au fichier?...

    je crois que le pb vient du fait que les 2 appli accèdent à ce fichier
    parce que si je fait une autre copie du fichier dans un répertoire à part, que seul le FileSytemWatcher scrute, là ça marche bien...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    voilà le constructeur de ma classe dans laquelle je créé le FileSystemWatcher

    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
            public NouveauResultat(string strRepertoire)
            {
                try
                {
                    // scrutateur de répertoire
                    fsw = new FileSystemWatcher();
     
                    // Donner le répertoire source
                    fsw.Path = strRepertoire;
                    sRepertoire = strRepertoire;
     
                    // Accepter le multi répertoires
                    fsw.IncludeSubdirectories = true;
     
                    // Filtrer tous les fichiers xml
                    fsw.Filter = "*.xml";
     
                    // Activer le composant
                    fsw.EnableRaisingEvents = true;
     
                    // Création du délégué d'écoute du répertoire source
                    fsw.Created += new FileSystemEventHandler(fsw_Created);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    et là, la méthode de l'évènement create :
    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
            private void fsw_Created(object sender, FileSystemEventArgs e)
            {
                try
                {
                    #region Vérification d'accessiblité du fichier
                    int cpteur = 0;     // compteur des tentatives d'accès au fichier
                    bool fin = false;   // booléen de sortie de boucle
                    bool ok = true;
                    while (!fin)
                    {
                        try
                        {
                            // Tentative d'ouverture du fichier
                            FileStream f = File.Open(sRepertoire + @"\" + e.Name, FileMode.Open, FileAccess.Read, FileShare.None);
     
                            // Si elle est réussie, on le referme
                            f.Close();
                            fin = true;     // pour sortir de la boucle
                        }
                        catch
                        {
                            Thread.Sleep(200);
                            // Si l'ouverture est impossible, on intercepte l'exception
                            if (++cpteur == 20)
                            {
                                // au bout de 20 tentatives, on signale l'impossibilité d'accéder au fichier
                                ok = false;
                                fin = true;
                            }
                        }
                    }
                    #endregion
                    // le fichier est libre, on peut dire à l'ihm de le charger
                    if (ok)
                    {
                        FichierResultat evt = new FichierResultat(e.Name);
                        InfoResultat(this, evt);     // envoi d'un évènement statuant du transfert de ce fichier
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    ...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Par défaut
    montre moi ton code d'écriture du fichier que je puisse t'aider un truc du genre

    StreamWriter tmpStream = new StreamWriter("test.txt");
    ecritLesDonnée();
    tmpStream.Close();

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

Discussions similaires

  1. Lecture fichier Word et remplacement paramètre
    Par Pfeffer dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/02/2005, 17h30
  2. [ifstream] pb lecture fichier non sequentielle
    Par bludo dans le forum SL & STL
    Réponses: 3
    Dernier message: 10/02/2005, 21h30
  3. [LG]probleme lecture fichier
    Par yp036871 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2004, 19h22
  4. [LG]Probleme lecture fichier file of ....
    Par John_win dans le forum Langage
    Réponses: 11
    Dernier message: 11/11/2003, 18h53
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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