Dim file As New IO.FileStream("C:\sti\til\fil.log", IO.FileMode.Open, _ IO.FileAccess.Read, IO.FileShare.ReadWrite) Dim reader As New IO.StreamReader(file)
Mener du, at du vil tjekke, om der er blevet tilføjet en linie til loggen, og hvis der er, vil du indlæse den - alt imens filen er åben i både din applikation og programmet, som skriver til loggen?
Det du har skrevet åbner kun filen så den er klar til at blive læst, det programmet skal, er at blive ved med at forsøge at læse næste linje selvom den har nået bunden af filen, og når der så bliver skrevet en ny linje af det eksterne program (som har skrive adgang) skal denne kunne bruges af mit program.
skriv hvis det er helt hen i verjret det jeg har skrevet :)
Public Sub StartRead(ByVal pLogFile As String) m_Cancel = False Dim file As New IO.FileStream(pLogFile, IO.FileMode.Open, _ IO.FileAccess.Read, IO.FileShare.ReadWrite) Dim reader As New IO.StreamReader(file) Try Dim Line As String Do Until m_Cancel = True If reader.Peek > -1 Then Line = reader.ReadLine Else 'Stop tråden i 1 sekund og prøv igen System.Threading.Thread.CurrentThread.Sleep(1000) End If Loop Finally reader.Close() End Try End Sub
Public Sub StopRead() m_Cancel = True End Sub
Et kald til fx StartRead("C:\sti\til\fil.log") vil få den til at forsøge at læse fra filen, og så snart den når slutningen af filen, venter den et sekund, og prøver at læse igen. For at stoppe denne proces, kalder du StopRead(). Den sætter en member variabel, m_Cancel, til True, hvilket får Do-Loop'et i StartRead metoden til at afslutte.
Har ikke testet ovenstående i praksis, så du må sige til, hvis det ikke virker.
foelgende er en konvertering af noget C# kod ejeg lavede for en maaned siden:
Imports System Imports System.IO Imports System.Threading
Namespace E Public Class TailSniff Private filename As String Private pos As Long
Public Sub New(ByVal filename As String) Me.filename = filename pos = 0 End Sub Public Function Read() As StreamReader Dim fs As FileStream = New FileStream(filename, FileMode.Open, FileAccess.Read) Dim len As Long = fs.Length fs.Seek(pos, SeekOrigin.Begin) Dim b(len - pos) As Byte fs.Read(b, 0, b.Length) fs.Close pos = len Return New StreamReader(New MemoryStream(b)) End Function End Class
Public Class MainClass Public Shared Sub Main(ByVal args As String()) Dim ts As TailSniff = New TailSniff("C:\z.z") While True Dim sr As StreamReader = ts.Read While sr.Peek > 0 Dim line As String = sr.ReadLine Console.WriteLine(line) End While sr.Close Thread.Sleep(10) End While End Sub End Class End Namespace
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.