Textfile neue Zeilen auslesen.

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von d3luxee.

    Textfile neue Zeilen auslesen.

    Ich arbeite aktuell an einem Programm das ein Logfile von einem Gameserver einliest und den IngameChat ausliest um damit Ingame-Commands für admins zu ermöglichen. Soweit funktioniert das auch, ich habe auch eine möglichkeit gefunden die neuen Zeilen im Logfile einzulesen! Hierzu lese ich beim Programmstart das Logfile komplett ein und dann lese ich es erneut ein, ich gleiche beide ab und lese die entsprechenden Zeilen aus, danach wird die Variable die, das Logfile vom ersten einlesen enthält mit dem neuen überschrieben und es beginnt von vorne!

    Das Problem ist das diese Methode nicht effektiv genug ist da ein Logfile gut 100MB haben kann und das Programm dadurch ca. 200Mb braucht...

    Meine Frage ist also, gibt es eine Methode mit der ich einen Filestream öffnen kann der immer die aktuellen daten enthält, sodass ich mit xy.readline einfach immer die nächste Zeile einlesen kann?

    Ich wäre sehr dankbar wenn mir da jemand weiter helfen könnte!

    Momentan sieht der entsprechende Code so aus:

    Quellcode

    1. Dim x As New StreamReader(New FileStream(lo, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    2. Console.WriteLine("Get Playerlist...")
    3. Dim tmx() As String = x.ReadToEnd().Split(Environment.NewLine)
    4. Dim l As New List(Of String)
    5. 'Ab hier
    6. en:
    7. x = New StreamReader(New FileStream(lo, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    8. Dim neww() As String = x.ReadToEnd().Split(Environment.NewLine)
    9. If tmx.Length <> neww.Length Then
    10. For i As Integer = tmx.Length - 1 To neww.Length - 1
    11. l.Add(neww(i))
    12. Next
    13. End If


    Hoffentlich blickt ihr bei meinem Codestil durch :D
    Mach es so und merk Dir die Ausgabeposition:

    VB.NET-Quellcode

    1. Dim fs = new System.IO.FileStream(lo, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)
    2. fs.Seek(DEINE_POSITION, System.IO.SeekOrigin)
    3. x = new System.IO.StreamReader(fs)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich habe jetzt mal eine methode gebastelt, momentan sieht der Code wie folgt aus:

    Quellcode

    1. Dim leng As Long
    2. Dim x As StreamReader
    3. Dim fs = New System.IO.FileStream(lo, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)
    4. leng = fs.Length
    5. ' x = New System.IO.StreamReader(fs)
    6. Console.WriteLine("Get Playerlist...")
    7. 'Dim tmx() As String = x.ReadToEnd().Split(Environment.NewLine)
    8. Dim l As New List(Of String)
    9. 'Ab hier
    10. en:
    11. fs = New System.IO.FileStream(lo, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)
    12. If fs.Length <> leng Then
    13. fs.Seek(leng, SeekOrigin.Begin)
    14. x = New System.IO.StreamReader(fs)
    15. While x.Peek <> -1
    16. l.Add(x.ReadLine)
    17. End While
    18. leng = fs.Length
    19. Else
    20. GoTo en
    21. End If


    Es benötigt nun für 3 Server, 200mb Ram... es ist natürlich schon effektiver geworden, jedoch gibt es einige andere fehler die ich jetzt noch beheben werde. Mein frage ist jedoch ob ich das mit SeekOrigin.End irgendwie von hinten einlesen kann.. oder ob ich den Speicherbedarf sonst irgendwie optimieren kann!
    Desweiteren benötigt das Programm nun ca. 40% CPU bei einem Oktacore..

    Danke für deine bisherige hilfe, das hat mich schonmal um einiges weiter gebracht!