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 :

Lecture d'un fichier texte [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Amateur
    Inscrit en
    Janvier 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Amateur

    Informations forums :
    Inscription : Janvier 2012
    Messages : 10
    Par défaut Lecture d'un fichier texte
    Bonjour à tous.
    Je cherche depuis pres de deux semaines une solution à mon problème pour le développement d'une application WPF.
    En résumé ce que je voudrais faire:
    - Lire un fichier texte qui s'actualise aléatoirement.(il peut prendre 10 lignes d'un coup puis plus rien pendant 1 Mn) c'est un fichiet d'un chat d'un jeu.
    Décortiquer chaque ligne du fichier pour pouvoir les inserer dans une base de donnée.(Vérifier avant insertion dans la base si la ligne existe deja.)

    Pour mon code j'ai commencer à lire le fichier texte en créant un timer qui relie le fichier toute les 100 millisecondes.(il faudrais que ce soit en temps réel pour créer des statistiques.)

    J'ai réussi à créé le timer et la lecture se fait toutes les 100 millisecondes.La je n'ai aucun problème tous fonctionne.

    Mon problème est que lorsque je veut lire toutes les lignes pour pouvoir les décortiquer et les classer par exemples avec un readallline j ai une exception outofmemory.(quand le fichier depasse 9Ko)
    et quand j'essaye de faire une ReadLine je n'ai plus toutes les lignes la fenetre freeze et ne prend plus toutes les lignes.

    voici mon code :
    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
    45
    46
    47
    48
    49
    public partial class EssaiChatLog : Window
        {
            private Classe.TimerLectureChatLog ComptageGlobal;
     
            // Obtenir le nom de l'utilisateur de l'ordinateur
            string Username = System.Windows.Forms.SystemInformation.UserName;
     
            public EssaiChatLog()
            {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(MiseEnRoute);
     
            }
     
     
            // Méthode pour mettre une remise en route automatique toute  
            //les 500 milliseconde
            // La Classe se trouve sur une autre page
            public void MiseEnRoute(object sender, RoutedEventArgs e)
            {
                ComptageGlobal = new TimerLectureChatLog(TimeSpan.FromMilliseconds(0));
                ComptageGlobal.Comptage += new EventHandler(LectureFichier);
     
                ComptageGlobal.Start();
     
            }
     
            // Lecture du fichier text
            public void LectureFichier(object sender, EventArgs e)
            {
                string URLChat = File.ReadAllText(@"C:\Users\" + Username + @"\Documents\Gestyopia\TXT\URLChat.txt");
                string fileName = @"" + URLChat + "";
                TextReader Lecture;
                // Ouverture du fichier Chat.log et lecture ligne par ligne du fichier
                Lecture = new StreamReader(fileName);
                string lignes = Lecture.ReadToEnd();
                textBoxLectureFichier.Text = lignes;
     
                Lecture.Close();
                Lecture.Dispose();
     
     
     
     
     
            }
     
     
        }
    A mon avis je dois mal me prendre sur les methodes que j'utilise.

    Donc si vous auriez des infos se serais avec joie car la je bloque entierement.

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Oublie ton timer, et utilise un watchfile (me souvient plus bien du nom).

    Y'a un truc qui te permet de t'abonner aux événements du système de fichier pour des éléments données (fichier, dossier, lecteur).

    Donc tu t'abonnes aux modification sur ce fichier, et comme ça tu auras un événement qui sera déclénché à chaque modification.

    C'est plus propre qu'un timer : si t'as 10 modications en 20 ms, tu auras 20 déclenchements de suite, et si t'as plus rien pendant 2 heures, ton programme ne fera rien pendant deux heures.

    Revers de la médaille : c'est consommateur en ressources, il ne faut donc pas abuser de ce mécanisme. Mais pour surveiller un fichier, c'est parfait !

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pour test, dans un projet de type commandline.
    => Crée un fichier c:\in\toto.txt et ouvre-le avant de lancer le programme.
    => Joue dans le fichier avec notepad.
    => Enjoy !

    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
     
    using System;
     
    namespace TestWatchFile
    {
        class Program
        {
            static void Main(string[] args)
            {
                System.IO.FileSystemWatcher fsw = new System.IO.FileSystemWatcher("c:\\in", "toto.txt");
                fsw.IncludeSubdirectories = false;
                fsw.EnableRaisingEvents = true;
                fsw.NotifyFilter = System.IO.NotifyFilters.LastWrite;
                fsw.Changed += totochanged;
                fsw.Error += totoerror;
     
                Console.ReadKey(true);
            }
     
            static void totochanged(object sender, System.IO.FileSystemEventArgs e)
            {
                Console.WriteLine("toto a changé : " + e.ChangeType.ToString());
            }
     
            static void totoerror(object sender, System.IO.ErrorEventArgs e)
            {
                Console.WriteLine("toto a planté : " + e.GetException().Message);
            }
        }
    }
    A noter que UltraEdit-32, c'est de la bonne daube en branches... A chaque modification, ça fait 3 accès en écriture au fichier

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Amateur
    Inscrit en
    Janvier 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Amateur

    Informations forums :
    Inscription : Janvier 2012
    Messages : 10
    Par défaut
    Merci pour la réponse et ca marche sans problème pour application console.
    Par contre pour une application wpf j ai un soucis.
    Dans un messageBox cela fonctionne, mais si je decide de mettre un message dans un textbox j'ai le message suivant :

    Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.
    J avoue que la je suis perdu.

    Voici mon code :

    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
    // Obtenir le nom de l'utilisateur de l'ordinateur
            string Username = System.Windows.Forms.SystemInformation.UserName;
     
            public EssaiChatLog()
            {
                InitializeComponent();
     
     
                FileSystemWatcher fsw = new FileSystemWatcher(@"C:\Users\" + Username + @"\Documents\Entropia Universe", "chat.log");
     
                fsw.IncludeSubdirectories = true;
                fsw.EnableRaisingEvents = true;
                fsw.Changed += new FileSystemEventHandler(fsw_Changed);
            }
     
            public void fsw_Changed(object sender, FileSystemEventArgs e)
            {
                MessageBox.Show(e.FullPath + "A changé... \n Ouf ca avance...");
                textBoxLectureFichier.Text = "Si la ca marche suis un bon lol....................";
            }
    en fait il faudra que je lise et decortique le fichier texte donc il faudra que j ajoute le tout dans un textbox je pense. Ou avez vous une meilleur solutions???

  5. #5
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Bonsoir,

    Tu ne peux modifier ton contrôle que depuis le thread qui l'a créer.
    Tu dois faire appel à maTextBox.Dispatcher.Invoke qui va se charger d'effectuer l'opération sur le thread auquel appartient le contrôle.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Amateur
    Inscrit en
    Janvier 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Amateur

    Informations forums :
    Inscription : Janvier 2012
    Messages : 10
    Par défaut
    Merci à StringBuilder et Jerede car mon code fonctionne à merveille.
    A chaque fois que le fichier texte change l'évènement est lancer. C'est mille fois mieux que mon timer que j avais mis en place et qui tournais sans fin.
    Pour ce qui veulent l'apercu du code fonctionel le voici :

    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
    public partial class EssaiChatLog : Window
        {
     
     
            // Obtenir le nom de l'utilisateur de l'ordinateur
            string Username = System.Windows.Forms.SystemInformation.UserName;
     
            // Variable pour effectuer un comptage du nombre de fois que le fichier 
            //à été changé
            int Comptage = 0;
     
            public EssaiChatLog()
            {
                InitializeComponent();
     
     
                FileSystemWatcher fsw = new FileSystemWatcher(@"C:\Users\" + Username + @"\Documents\Entropia Universe", "chat.log");
     
                fsw.IncludeSubdirectories = true;
                fsw.EnableRaisingEvents = true;
     
                fsw.Changed += new FileSystemEventHandler(fsw_Changed);
            }
     
            public void fsw_Changed(object sender, FileSystemEventArgs e)
            {
                MessageBox.Show(e.FullPath + "A changé... \n Ouf ca avance...");
                Comptage++;
                textBoxLectureFichier.Dispatcher.Invoke(
               System.Windows.Threading.DispatcherPriority.SystemIdle,
               new Action(
                 delegate()
                 {
                     textBoxLectureFichier.Text = "Si la ca marche suis un bon lol....................\nNombre de relecture : " + Comptage;
                 }
             ));
     
            }
     
     
        }
    Encore merci , je posterais un autre message pour pouvoir décortiquer car la aussi j avais un soucis mais il est possible que cela venais du faite que mon code était relancé toute les 100 milliseconde.


    PS : pour le decorticage du fichier avec des REGEX vaut il mieux le faire direct sur le fichier ou mettre le tout dans un textbox ou list et ensuite décortiquer???

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

Discussions similaires

  1. Lecture d'un fichier texte dans un projet TOMCAT
    Par brice_nice dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 03/07/2005, 15h04
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

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