begin process at 2010 02 10 01:30:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

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

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


 Information sur la source

Note :
Aucune note
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é :7 922 / 306

Auteur : pdl

Ecrire un message privé
Site perso
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

Les Membres Club peuvent 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"

 Sources de la même categorie

Source avec Zip PILOTER WORD VIA MICROSOFT.OFFICE.INTEROP.WORD par whismeril
Source avec Zip PILOTER EXCEL VIA MICROSOFT.OFFICE.INTEROP.EXCEL par whismeril
Source avec Zip Source .NET (Dotnet) CHECK IDENTICAL FILES par eldim
Source avec Zip Source avec une capture Source .NET (Dotnet) RICHTEXTBOX NUMÉROTÉ (NUMÉROS DE LIGNES) par jray
Source avec Zip Source avec une capture SURVEILLER FICHIERS CRÉÉS AVEC FILESYSTEMWATCHER AMÉLIORÉ par TheOnlyMaX

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) RECHERCHE ET GESTION DE FICHIERS PERSONNALISÉES par JeremyLecouvert
Source .NET (Dotnet) GREP POUR WINDOWS par Warny
Source avec Zip Source .NET (Dotnet) CHECK IDENTICAL FILES par eldim
Source avec Zip Source avec une capture Source .NET (Dotnet) YTREWQ - POUR MODIFIER RÉGULIÈREMENT VOTRE FOND D'ÉCRAN par ANTHIBUG
Source avec Zip Source avec une capture Source .NET (Dotnet) SUPPRIMER LES TAG BOM DANS FICHIER UTF-8 par gluk

Commentaires et avis

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.

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.

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...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales