Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FILEWATCHER - AFFICHER LES MODIFICATIONS D'UN FICHIER EN TEMPS RÉEL


Information sur la source

Catégorie :Fichiers / Disque Source .NET ( DotNet ) Classé sous : fichier, surveillance, background, tâche fonds Niveau : Débutant Date de création : 22/01/2008 Date de mise à jour : 22/01/2008 20:31:57 Vu / téléchargé: 5 695 / 211

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Ce petit programme permet d'afficher le contenu d'un fichier et recharger automatiquement celui-ci s'il est modifié.

Plusieurs aspects peuvent être intéressant dans ce programme
* Utilisation du FileSystemWathcher (voir nombreux articles sur le sujet)
* Utilisation du BackgroundWorker pour le chargement de fichier en tâche de fonds
* Utilisation de l'éditeur de texte de CSharpDevelop


 

Source

  • using System;
  • using System.ComponentModel;
  • using System.IO;
  • using System.Text;
  • using System.Windows.Forms;
  • namespace Editor
  • {
  • public partial class Form1 : Form
  • {
  • /// <summary>
  • /// Nom du fichier chargé
  • /// </summary>
  • private string filename;
  • /// <summary>
  • /// Taille actuellement chargée du fichier
  • /// </summary>
  • private int filesize = 0;
  • /// <summary>
  • /// Constructeur
  • /// </summary>
  • public Form1()
  • {
  • InitializeComponent();
  • }
  • #region Events
  • /// <summary>
  • /// Evénements déclenché lorsque le fichier surveillé est modifié
  • /// </summary>
  • /// <param name="sender"></param>
  • /// <param name="e"></param>
  • private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
  • {
  • try
  • {
  • // Chargement du fichier surveillé
  • LoadFile(filename);
  • }
  • catch (Exception ex)
  • {
  • string errorMessage = ex.Message;
  • while (ex.InnerException != null)
  • {
  • ex = ex.InnerException;
  • errorMessage += "\n" + ex.Message;
  • }
  • MessageBox.Show(errorMessage, "Unexpected error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  • }
  • }
  • /// <summary>
  • /// Sélection d'un fichier à surveiller et chargement de celui-ci
  • /// </summary>
  • /// <param name="sender"></param>
  • /// <param name="e"></param>
  • private void buttonLoad_Click(object sender, EventArgs e)
  • {
  • if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  • {
  • try
  • {
  • // Initialisation à zéro de la taille du fichier déjà chargé
  • filesize = 0;
  • // Sauvgarde du nom du fichier à charger
  • filename = openFileDialog1.FileName;
  • // Affichage du nom du fichier dans la barre de titre de la fenetre
  • this.Text = "FileWatcher - " + filename;
  • // Chargement du fichier sélectionné
  • LoadFile(filename);
  • }
  • catch (Exception ex)
  • {
  • string errorMessage = ex.Message;
  • while (ex.InnerException != null)
  • {
  • ex = ex.InnerException;
  • errorMessage += "\n" + ex.Message;
  • }
  • MessageBox.Show(errorMessage, "Unexpected error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  • }
  • }
  • }
  • /// <summary>
  • /// Permet d'arrêter ou reprendre le suivi du fichier chargé
  • /// </summary>
  • /// <param name="sender"></param>
  • /// <param name="e"></param>
  • private void buttonStop_Click(object sender, EventArgs e)
  • {
  • if (buttonStop.Text == "Stop")
  • {
  • fileSystemWatcher1.EnableRaisingEvents = false;
  • buttonStop.Text = "Start";
  • }
  • else
  • {
  • fileSystemWatcher1.EnableRaisingEvents = true;
  • buttonStop.Text = "Stop";
  • }
  • }
  • #endregion
  • private void LoadFile(string filename)
  • {
  • // Si il y a déjà une tâche de fonds l'arrêter
  • if (backgroundWorker.IsBusy)
  • backgroundWorker.CancelAsync();
  • // Attendre pour etre certain qu'il n'y plus de tâche de fonds en cours
  • while (backgroundWorker.IsBusy) ;
  • // Activer la barre de chargement
  • toolStripProgressBar.Visible = true;
  • // Lancer le chargement en arrière plan
  • backgroundWorker.RunWorkerAsync(filename);
  • }
  • #region delegate
  • private delegate void setProgressBarPecentage(int percentage);
  • /// <summary>
  • /// Procédure pour afficher l'état d'avancement du chargement du fichier
  • /// </summary>
  • /// <param name="percentage"></param>
  • private void SetProgressBarPecentage(int percentage)
  • {
  • toolStripProgressBar.Value = percentage;
  • }
  • #endregion
  • #region worker
  • /// <summary>
  • /// Routine qui est exécutée en tâche de fonds
  • /// </summary>
  • /// <param name="sender"></param>
  • /// <param name="e"></param>
  • private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
  • {
  • try
  • {
  • // Récupération du handle sur le process en cours
  • BackgroundWorker worker = sender as BackgroundWorker;
  • // ouverture du fichier en mode partagé
  • FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  • // Positionnement à l'endroit jusqu'où on avait déjà lu le fichier
  • fs.Seek(filesize, SeekOrigin.Begin);
  • // Total de byte déjà lu dans le fichier
  • int totalRead = filesize;
  • // Nouvelle taille du fichier
  • filesize = (int)fs.Length;
  • // Initialisation du buffer de lecture
  • byte[] buffer = new byte[1024];
  • // Nbre de caractère lu à chaque incrément
  • int count = 0;
  • // Chaîne de réception pour la lecture du fichier
  • string texte = "";
  • while ((count = fs.Read(buffer, 0, 1024)) != 0 && !worker.CancellationPending)
  • {
  • totalRead += count;
  • // Transformation du tableau byte[] en string
  • texte += Encoding.ASCII.GetString(buffer, 0, count);
  • // Modification de l'état d'avancement
  • worker.ReportProgress((totalRead * 100) / filesize);
  • }
  • // Initialisation de la chaîne de retour avec le contenu du fichier
  • e.Result = texte;
  • // Fermeture du Flux
  • fs.Close();
  • if (worker.CancellationPending)
  • {
  • e.Cancel = true;
  • }
  • }
  • catch (Exception ex)
  • {
  • string errorMessage = ex.Message;
  • while (ex.InnerException != null)
  • {
  • ex = ex.InnerException;
  • errorMessage += "\n" + ex.Message;
  • }
  • MessageBox.Show(errorMessage, "Unexpected error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  • }
  • }
  • /// <summary>
  • /// Mise à jour de la barre de progression
  • /// </summary>
  • /// <param name="sender"></param>
  • /// <param name="e"></param>
  • private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  • {
  • // Vérification si on est dans un thread et éventuellement appel du délégate pour pouvoir faire mise à jour
  • if (this.InvokeRequired)
  • this.Invoke(new setProgressBarPecentage(SetProgressBarPecentage), new object[] { e.ProgressPercentage });
  • else
  • SetProgressBarPecentage(e.ProgressPercentage);
  • }
  • /// <summary>
  • /// Méthode appelée lorsque le fichier a été chargé
  • /// </summary>
  • /// <param name="sender"></param>
  • /// <param name="e"></param>
  • private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  • {
  • // Vérification si tout s'est bien déroulé
  • if (e.Cancelled)
  • {
  • // L'utilisateur à annulé l'opération
  • toolStripStatusLabel1.Text = string.Format("Aborted by user.");
  • }
  • else if (e.Error != null)
  • {
  • // Il y a eu une erreur pendant le traitement.
  • string msg = String.Format("An error occurred: {0}", e.Error.Message);
  • MessageBox.Show(msg);
  • }
  • else
  • {
  • // Tout s'est bien déroulé
  • // Affichage du fichier dans le contrôle ICsharpCode.TextEditor
  • textEditorControl1.Text += e.Result.ToString();
  • // Calcul du nombre de ligne dans le contrôle ICsharpCode.TextEditor
  • int totalLine = textEditorControl1.Document.GetLineNumberForOffset(textEditorControl1.Text.Length);
  • // Déplacement jusqu'à la dernière ligne
  • textEditorControl1.ActiveTextAreaControl.ScrollTo(totalLine, 1);
  • // Affichage d'inforamtions dans la barre du d'info du bas de l'écran
  • toolStripStatusLabel1.Text =
  • string.Format("{0} lines - last accesss : {1} - {2} ", totalLine,
  • File.GetLastWriteTime(filename).ToShortDateString(),
  • File.GetLastWriteTime(filename).ToLongTimeString());
  • // Initialisation de la surveillance du fichier chargé
  • fileSystemWatcher1.Filter = Path.GetFileName(filename);
  • fileSystemWatcher1.Path = Path.GetDirectoryName(filename);
  • fileSystemWatcher1.EnableRaisingEvents = true;
  • // Activation du boutton d'arrêt de surveillance
  • buttonStop.Enabled = true;
  • }
  • // Cacher la barre de progression du chargement de fichier
  • toolStripProgressBar.Visible = false;
  • }
  • #endregion
  • }
  • }
using System;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace Editor
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Nom du fichier chargé
        /// </summary>
        private string filename;

        /// <summary>
        /// Taille actuellement chargée du fichier
        /// </summary>
        private int filesize = 0;

        /// <summary>
        /// Constructeur
        /// </summary>
        public Form1()
        {
            InitializeComponent();            
        }

        #region Events
        /// <summary>
        /// Evénements déclenché lorsque le fichier surveillé est modifié
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
        {
            try
            {
                // Chargement du fichier surveillé
                LoadFile(filename);               
            }
            catch (Exception ex)
            {
                string errorMessage = ex.Message;
                while (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                    errorMessage += "\n" + ex.Message;
                }
                MessageBox.Show(errorMessage, "Unexpected error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// Sélection d'un fichier à surveiller et chargement de celui-ci
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonLoad_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                try
                {
                    // Initialisation à zéro de la taille du fichier déjà chargé
                    filesize = 0;
                    // Sauvgarde du nom du fichier à charger
                    filename = openFileDialog1.FileName;
                    // Affichage du nom du fichier dans la barre de titre de la fenetre
                    this.Text = "FileWatcher - " + filename;
                    // Chargement du fichier sélectionné
                    LoadFile(filename);
                }
                catch (Exception ex)
                {
                    string errorMessage = ex.Message;
                    while (ex.InnerException != null)
                    {
                        ex = ex.InnerException;
                        errorMessage += "\n" + ex.Message;
                    }
                    MessageBox.Show(errorMessage, "Unexpected error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        /// <summary>
        /// Permet d'arrêter ou reprendre le suivi du fichier chargé
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (buttonStop.Text == "Stop")
            {
                fileSystemWatcher1.EnableRaisingEvents = false;
                buttonStop.Text = "Start";
            }
            else
            {
                fileSystemWatcher1.EnableRaisingEvents = true;
                buttonStop.Text = "Stop";
            }
        }
        #endregion

        private void LoadFile(string filename)
        {
            // Si il y a déjà une tâche de fonds l'arrêter
            if (backgroundWorker.IsBusy)
                backgroundWorker.CancelAsync();
            // Attendre pour etre certain qu'il n'y  plus de tâche de fonds en cours
            while (backgroundWorker.IsBusy) ;
            // Activer la barre de chargement
            toolStripProgressBar.Visible = true;
            // Lancer le chargement en arrière plan
            backgroundWorker.RunWorkerAsync(filename);
        }

        #region delegate
        private delegate void setProgressBarPecentage(int percentage);
        /// <summary>
        /// Procédure pour afficher l'état d'avancement du chargement du fichier
        /// </summary>
        /// <param name="percentage"></param>
        private void SetProgressBarPecentage(int percentage)
        {
            toolStripProgressBar.Value = percentage;
        }

        #endregion

        #region worker
        /// <summary>
        /// Routine qui est exécutée en tâche de fonds
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {                      
            try
            {
                // Récupération du handle sur le process en cours
                BackgroundWorker worker = sender as BackgroundWorker;
                // ouverture du fichier en mode partagé
                FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                // Positionnement à l'endroit jusqu'où on avait déjà lu le fichier
                fs.Seek(filesize, SeekOrigin.Begin);
                // Total de byte déjà lu dans le fichier
                int totalRead = filesize;
                // Nouvelle taille du fichier
                filesize = (int)fs.Length;
                
                // Initialisation du buffer de lecture
                byte[] buffer = new byte[1024];
                // Nbre de caractère lu à chaque incrément
                int count = 0;
                // Chaîne de réception pour la lecture du fichier
                string texte = "";
                while ((count = fs.Read(buffer, 0, 1024)) != 0 && !worker.CancellationPending)
                {                    
                    totalRead += count;
                    // Transformation du tableau byte[] en string
                    texte += Encoding.ASCII.GetString(buffer, 0, count);
                    // Modification de l'état d'avancement
                    worker.ReportProgress((totalRead * 100) / filesize);
                }
                // Initialisation de la chaîne de retour avec le contenu du fichier
                e.Result = texte;
                // Fermeture du Flux
                fs.Close();

                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                }
            }
            catch (Exception ex)
            {
                string errorMessage = ex.Message;
                while (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                    errorMessage += "\n" + ex.Message;
                }
                MessageBox.Show(errorMessage, "Unexpected error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
        }
                
        /// <summary>
        /// Mise à jour de la barre de progression
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // Vérification si on est dans un thread et éventuellement appel du délégate pour pouvoir faire mise à jour
            if (this.InvokeRequired)
                this.Invoke(new setProgressBarPecentage(SetProgressBarPecentage), new object[] { e.ProgressPercentage });
            else
                SetProgressBarPecentage(e.ProgressPercentage);            
        }
        /// <summary>
        /// Méthode appelée lorsque le fichier a été chargé
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // Vérification si tout s'est bien déroulé
            if (e.Cancelled)
            {
                // L'utilisateur à annulé l'opération
                toolStripStatusLabel1.Text = string.Format("Aborted by user.");
            }
            else if (e.Error != null)
            {
                // Il y a eu une erreur pendant le traitement.
                string msg = String.Format("An error occurred: {0}", e.Error.Message);
                MessageBox.Show(msg);
            }
            else
            {
                // Tout s'est bien déroulé
                // Affichage du fichier dans le contrôle ICsharpCode.TextEditor
                textEditorControl1.Text += e.Result.ToString();
                // Calcul du nombre de ligne dans le contrôle ICsharpCode.TextEditor
                int totalLine = textEditorControl1.Document.GetLineNumberForOffset(textEditorControl1.Text.Length);
                // Déplacement jusqu'à la dernière ligne
                textEditorControl1.ActiveTextAreaControl.ScrollTo(totalLine, 1);
                // Affichage d'inforamtions dans la barre du d'info du bas de l'écran
                toolStripStatusLabel1.Text =
                    string.Format("{0} lines - last accesss : {1} - {2} ", totalLine,
                                  File.GetLastWriteTime(filename).ToShortDateString(),
                                  File.GetLastWriteTime(filename).ToLongTimeString());
                // Initialisation de la surveillance du fichier chargé
                fileSystemWatcher1.Filter = Path.GetFileName(filename);
                fileSystemWatcher1.Path = Path.GetDirectoryName(filename);
                fileSystemWatcher1.EnableRaisingEvents = true;
                // Activation du boutton d'arrêt de surveillance
                buttonStop.Enabled = true;
            }
            // Cacher la barre de progression du chargement de fichier
            toolStripProgressBar.Visible = false;
        }
        #endregion
    }
}

Conclusion

Ce programme, comme pratiquement tous, peut être amélioré, mais il remplit mais besoin actuel...
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

22 janvier 2008 20:31:57 :
Ajout de l'information "Utilise la technologie .net"

Commentaires et avis

signaler à un administrateur
Commentaire de Warny le 23/01/2008 10:35:01

Salut,
Dans ton exemple tu montres un fichier de trace www. Je te conseille de prévoir le cas (à la discrétion de l'utilisateur) d'une modification par ajout en ne rechargeant que la fin du fichier à chaque modif. Tu gagnerait ainsi un temps précieux.
Sinon, pour lire une fichier texte, tu peux utiliser un textStream et la fonction ReadToEnd pour le lire en une fois.

signaler à un administrateur
Commentaire de pdl le 23/01/2008 10:44:22

Bonjour,

Si tu regardes bien la source, tu verras que je ne recharge que la fin du fichier s'il y a une modification de celui-ci. C'est la raison pour laquelle j'utilise la variable filesize qui me permet de sauver le nombre d'octets que j'ai déjà lu et de faire ensuite un seek.
Pour le textStream, cela pose un problème si le fichier est déjà ouvert par un processus quelconque. J'étais parti sur ce principe, mais si tu veux monitorer un fichier log d'apache, par exemple, et bien tu ne sais tout simplement pas ouvrir le fichier et c# te prévient gentiment que le fichier est déjà ouvert par quelqu'un d'autre.

signaler à un administrateur
Commentaire de Warny le 23/01/2008 11:41:58

Autant pour moi, je n'avais pas repéré la variable.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

[WMI] appli de surveillance à distance [ par Pixelmort ] Bonjour, Dans le cadre d'un stage de fin de première année de BTS Informatique Industriel (IRIS), je dois créer une petite application utilisant WMI fichier texte [ par ducker88 ] Bonjour à tous,J'aimerai savoir s'il existe un moyen rapide et simple de parcourir chaque ligne d'un fichier.J'enregistre des données dans un fichier Conversion Brush en string [ par hoodlum ] Bonjour a tous, Je suis entrain de creer un fichier xml de configuration pour un programme, et dans ce fichier j'aimerai mettre la conversion en strin Lecture/Ecriture dans fichier config.txt [ par Moomoon07 ] J'ai créé une application Csharp (gestion d'entreprise avec base de donnée) et j'aimerais qu'elle puisse créer un fichier config.txt dans son dossier Transfert de fichier + Signature [ par pepe013 ] Bonjour, Comment faire pour réaliser un transfert de fichier vers un poste distant qui possede un compte différent ? Sachant que je ne peux pas créer [C# 2.0] Le Binaire [ par iow4 ] Bonjour, j'aimerais pouvoir lire entierement tout le code binaire d'un fichier exe et le reécrire dans un autre fichier ( le cloner ou le generer ) Se ouvrir fichier ou dossier [ par adnanester ] salut comment puij ouvrir un fichier ou dossier a partir d'une application c# et merci d'avance Où et comment souvegarder des mots de passe en toute sécurité? [ par fcolo ] Bonjour,je réalise une application de gestion de caméra IP.Pour se connecter au flux des caméras, l'utilisateur doit donner un nom d'utilisateur et u vérifier les tags [ par yogui411 ] Bonjour,Je voudrais faire une boucle qui lit tous les tags de mon fichier xml.Je pourrais ainsi vérifier si les tags sont corrects.Je sais charger un Nombre de lignes du fichier XML [ par Neo020585 ] Bonjour tout le monde, je suis en train de développer un petit projet perso, et je me heurte à quelques problèmes. J'analyse un fichier xml (valide)


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.