2009-07-29 5 views
4

Je regarde un fichier avec le code suivant:Obtenir de nouvelles lignes à partir d'un fichier avec FileSystemWatcher

 [..] 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = @"C:\"; 
     watcher.Filter = "t.log"; 
     watcher.Changed += new FileSystemEventHandler(watcher_Changed); 
     watcher.EnableRaisingEvents = true; 

     private static void watcher_Changed(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("Changed!"); 
     } 
     [..] 

Cela fonctionne. Maintenant, supposé que le contenu si le fichier est t.log:

row 1 
row 2 
row 3 
row 4 

Quand j'ajoute au fichier (et sauvegarder) quelques lignes et le fichier est ceci:

row 1 
row 2 
row 3 
row 4 
row 5 
row 6 

Comment puis-je récupérer que les lignes ajoutées sont "ligne 5" et "ligne 6"?

Notez que le fichier peut être très volumineux, donc avoir son contenu en mémoire et faire un diff avec la nouvelle version n'est pas une option. De même, stocker la valeur de la dernière ligne de lecture et compter à partir de ce n'est pas possible aussi, car cela me forcerait à lire le fichier entier à chaque fois, plus il pourrait y avoir des lignes avec la même valeur.

Toute aide vraiment appréciée.

+0

Pourriez-vous ajouter un champ d'horodatage à chaque ligne du fichier journal? – Jonathan

Répondre

6

Si c'est un journal, toujours en annexe, vous pouvez garder la taille du fichier et sur le changement:

using (FileStream fs = new FileStream("t.log", FileAccess.Read)) 
{ 
    fs.Seek(previousSize, SeekOrigin.Begin); 
    //read, display, ... 
    previousSize = fs.Length; 
} 
0

Le seul cas d'utilisation que je vois cela peut fonctionner est quand vous êtes seulement l'ajout de lignes. Ensuite, stockez simplement le nombre de lignes.

Questions connexes