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 :

[C# 2.0] Comment réussir une lecture programmé dans un fichier ?


Sujet :

C#

  1. #1
    Membre habitué Avatar de Sodangbe
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    171
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 171
    Points : 145
    Points
    145
    Par défaut [C# 2.0] Comment réussir une lecture programmé dans un fichier ?
    bonjour tout le monde

    je crée une application qui me permet de lire dans un fichier message(*.msg) et qui me permet de récupérer les lignes comportant le mot From: et le mot To:

    ensuite j'effectue un traitement avec ces variables que je recupere.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TextReader tr = new StreamReader(strMots, Encoding.Default);
                line = tr.ReadLine();
                while (line != null)
                {
                    if (line.StartsWith("To"))
                    {
                        VarTo = line;
                    }
                    if (line.StartsWith("From"))
                    {
                        VarFrom = line;
                     }
                 }
    mon probleme c'est qu'a la création de l'objet "tr "j'ai une exception qui est levée me disant que mon fichier "strMots" est en cours d'utilisation .
    je voudrais que ce bout de code ne commence a s'executer qu'apres le depot definitif du message dans ma boite.
    ou qu'il s'éxecute jusqu'a ce que le message ne soit plus dependant d'un autre processus

  2. #2
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par Sodangbe
    mon probleme c'est qu'a la création de l'objet "tr "j'ai une exception qui est levée me disant que mon fichier "strMots" est en cours d'utilisation.
    Ca veut dire que la dernière fois que tu l'as ouvert, tu ne l'as pas fermé. C'est pas bien

    Pour éviter ça, case TOUJOURS tes StreamReader/Writer dans un bloc 'Using'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Using(StreamReader reader = new StreamReader(...)
    {
    // là je colle mon code
    }
    // Et là je suis SUR que mon fichier est fermé.
    Voir mieux : si tu crains un plantage :
    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
    StreamReader reader = null;
    try
    {
      Using(reader = new StreamReader(...)
      {
      // là je colle mon code
      }
      // je colle mon reader à null pour éviter une double fermeture inutile
      reader = null;
    }
    finally
    {
      // si mon bloc 'using' a planté : le reader n'est pas fermé
      if(reader != null)
        // je le ferme
        reader.Close();
    }
    Citation Envoyé par Sodangbe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     TextReader tr = new StreamReader(strMots, Encoding.Default);
                line = tr.ReadLine();
                while (line != null)
                {
                    if (line.StartsWith("To"))
                    {
                        VarTo = line;
                    }
                    if (line.StartsWith("From"))
                    {
                        VarFrom = line;
                     }
                 }
    Question bête : il s'arrête quand ton while ? manque un line = tr.ReadLine(); dedans.

  3. #3
    Membre habitué Avatar de Sodangbe
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    171
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 171
    Points : 145
    Points
    145
    Par défaut
    En réalité c'est une appli qui recupere un fichier message dans ma boite aux lettre et commence par le lire.Mais au moment précis ou le message arrive ,il tente de le lire d'ou l'erreur.
    Tu comprends donc j'ai pas vraiment le temps d'ouvrir le fichier.

    estion bête : il s'arrête quand ton while ? manque un line = tr.ReadLine(); dedans.
    en effet j'ai recopier juste une partie de mon code et la je te le renvoie
    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
     TextReader tr = new StreamReader(strMots, Encoding.Default);
                line = tr.ReadLine();
                while (line != null)
                {
                    if (line.StartsWith("To"))
                    {
                        VarTo = line;
                    }
                    if (line.StartsWith("From"))
                    {
                        VarFrom = line;
                    }
     
                    if (line.StartsWith("Subject"))
                    {
     
                        VarOb = line;
     
                    }
     
     
     
                    line = tr.ReadLine();
     
                }
    thks...mais ca m'arrangerais que mon code attende que le fichier soit deposer avant de commencer a bosser d'ou le titre de ma discussion

  4. #4
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par Sodangbe
    En réalité c'est une appli qui recupere un fichier message dans ma boite aux lettre et commence par le lire.Mais au moment précis ou le message arrive ,il tente de le lire d'ou l'erreur.
    Tu comprends donc j'ai pas vraiment le temps d'ouvrir le fichier.
    Si si, je pense que tu vas prendre le temps de l'ouvrir
    Quand je dis 'ouvrir', je sous-entends (dans ce cas précis) 'ouvrir en lecture'.
    C'est peu comme un livre. Si tu l'ouvres pas, tu lis pas.

    Citation Envoyé par Sodangbe
    ca m'arrangerais que mon code attende que le fichier soit deposer avant de commencer a bosser d'ou le titre de ma discussion
    Solution 1 (bête et méchante)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // j'attend une seconde pour être sur que l'écriture du fichier soit terminée
    System.Threading.Thread.Sleep(1000);
    Solution 2 (lourde)
    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
    TextReader tr = null;
    bool done = false;
     
    // tant que ca marche pas
    while(!done)
    {
    	try
    	{
    		// je tente d'ouvrir
    		tr = new StreamReader(strMots, Encoding.Default);
    		// si j'arrive ici , c'est que ça a marché
    		done = true;
    	}
    	catch {}
    }
    // ca y'est, c'est ouvert !
    Solution 3 (Hybride)
    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
    // tant que ca marche pas
    while(!done)
    {
    	try
    	{
    		// je tente d'ouvrir
    		tr = new StreamReader(strMots, Encoding.Default);
    		// si j'arrive ici , c'est que ça a marché
    		done = true;
    	}
    	catch {}
    	// j'attend un peu pour pas trop forcer sur mon système
    	System.Threading.Thread.Sleep(300);
    }
    // ca y'est, c'est ouvert !
    Maintenant c'est du bidouillage tout ça. Je ne connais pas de façon d'être signalé lorsqu'un fichier vient d'être écrit. Tu prends ptet le pb à l'envers : comment es-tu averti qu'il existe ton fichier de message ? Qu'est ce qui te prévient ?

    Et j'insiste pour ce que j'ai dis avant : les usings et les try/catch c'est une bonne pratique pour éviter un gros message d'erreur tout laid le jour où y'a un pb.

  5. #5
    Membre habitué Avatar de Sodangbe
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    171
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 171
    Points : 145
    Points
    145
    Par défaut
    cool merci beaucoup!!!

    bon j'ai un FileSystemWatcher qui me surveille mon dossier ou vienne les message.Une fois que le message est arrivé rentre en jeu le bout de code que tu viens de me proposer.

    j'ai commencé par faire des tests il ont l'air concluant pour le moment je te tiens au courant demain
    thks

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/08/2013, 16h53
  2. Comment créer une base de donnée dans un fichier .txt
    Par vantoff dans le forum C++Builder
    Réponses: 9
    Dernier message: 19/07/2006, 19h44
  3. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  4. Comment écrire une très longue variable dans un fichier ?
    Par hijodelanoche dans le forum Langage
    Réponses: 8
    Dernier message: 17/11/2005, 16h12

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