|
Trouver une ressource
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
Description
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...
Historique
- 22 janvier 2008 20:31:57 :
- Ajout de l'information "Utilise la technologie .net"
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
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)
|
Téléchargements
Logiciels à télécharger sur le même thème :
|