Gå til innhold

Lese txt fil fra bunnen med C#


Anbefalte innlegg

Hei. Jeg lurte på om noen visste om en god måte og åpne en tekstfil og lese de 10 siste linjene?

Helst i realtime. Er en logg som skal lese. Hadde vært greit å slippe og oppdatete manuelt. Hvis det går da.

 

På forhånd takk.

Endret av kcobain
Lenke til kommentar
Videoannonse
Annonse

Med denne holdes filen åpen, men andre prosesser kan fortsatt skrive til den. Du får legge til kode for å huske på de 10 siste linjene selv. Den kan kjøres f.eks. som en egen tråd.

 

FileStream fs = File.Open("test.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs);
while (Console.KeyAvailable == false)
{
   System.Threading.Thread.Sleep(500);
   if (sr.EndOfStream == false)
   {
       string s = sr.ReadLine();
       Console.WriteLine(s);
   }
}

Lenke til kommentar
  • 3 uker senere...

Her har du en logklasse jeg mekket for å følge med på en loggfil.

Fu får se om du kan bruke noe fra denne.

 

 

 	LogMonitor lm = new LogMonitor(@"C:\mylog.txt" , false);
 	int c = 1;
 	while(!lm.IsEmpty) Console.WriteLine(c++ + " - " + lm.GetLine());
 	while(true){
   lm.Refresh();
   while(!lm.IsEmpty) Console.WriteLine(c++ + " - " + lm.GetLine());
   System.Threading.Thread.Sleep(200);
 	}

 

using System;
using System.Collections;
using System.IO;
using System.Text;

namespace MyNamespace {
/// <summary>
/// Summary description for LogMonitor.
/// </summary>
public class LogMonitor {
 private string LogFile = "";
 private int MaxLines = 100; //Holder de siste 100 linjene
 private Queue Lines = new Queue();
 private long FileSize = 0;

 public LogMonitor(string LogFile, bool ReadOld) {
 	this.LogFile = LogFile;
 	FileInfo fi = new FileInfo(LogFile);
 	FileSize = fi.Length;
 	if(ReadOld)	ReadLog(FileSize);
 }

 private void ReadLog(long NoOfBytes){
 	StringBuilder sb = new StringBuilder();
 	long filepos = FileSize;

 	FileStream fs = new FileStream(LogFile, FileMode.Open, FileAccess.Read,FileShare.ReadWrite);
 	fs.Position = filepos;
 	
 	int counter = 0;
 	
 	ArrayList tmp = new ArrayList();
 	
 	long origfilpos = filepos-1;

 	long minpos = FileSize-NoOfBytes;
 	
 	while(counter<MaxLines){
   filepos--;
   fs.Position = filepos;
   int i = fs.ReadByte();
   char c = Convert.ToChar(i);
   if(c=='\n'){
   	string backward = sb.ToString();
   	if(!(backward.Length==0 && filepos == origfilpos)){ //Dersom siste linje og tom, ignorer
     char[] chaarr = backward.ToCharArray();
     sb=new StringBuilder();
     for(int ci=chaarr.Length-1;ci>-1;ci--){
     	sb.Append(chaarr[ci]);
     }
     string right = sb.ToString();
     tmp.Add(right);
     sb=new StringBuilder();
     counter++;
   	}else{
     //FileSize--;
   	}
   }else if(c=='\r'){
   
   }else{
   	sb.Append(c);
   }
   
   if(filepos<=minpos){
   	if(sb.Length>0){
     //Noe data som burde hørt til forrige linje. Lager ny linje med disse
     string backward = sb.ToString();
     char[] chaarr = backward.ToCharArray();
     sb=new StringBuilder();
     for(int ci=chaarr.Length-1;ci>-1;ci--){
     	sb.Append(chaarr[ci]);
     }
     string right = sb.ToString();
     tmp.Add(right);
     counter++;
   	}
   	break;
   }
 	}
 	for(int i=tmp.Count-1; i>-1; i--)Lines.Enqueue(tmp[i]);
 	//Console.WriteLine(Lines.Count);
 	
 }

 public void Refresh(){
 	FileInfo fi = new FileInfo(LogFile);
 	long fs = fi.Length;
 	long filesize = fs-FileSize;

 	FileSize = fs;
 	
 	if(filesize<0){ 
   //Filen er blitt mindre. Les på nytt igjen
   //Console.WriteLine("Filen var mindre. Leser hele på nytt.");
   ReadLog(FileSize);
 	}else if(filesize>0){
   //Filen er blitt større. Les de siste endringer
   //Console.WriteLine("Filen var større. Legg til linjer.");
   ReadLog(filesize);
 	}else{
   //Console.WriteLine("Ingen endring...");
 	}
 	
 }

 public bool IsEmpty{
 	get{return Lines.Count==0 ? true : false;}
 }


 public string GetLine(){
 	return (string)Lines.Dequeue();
 }

 public string PeekLine(){
 	return (string)Lines.Peek();
 }
 
}
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...