Log eines anderen Programmes auslesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von MrTrebron.

    Log eines anderen Programmes auslesen

    Hey Community,

    Ich habe mal wieder eine Frage an euch: Ich möchte den Log eines anderen Programmes auslesen aber während das andere Programm läuft. Will ich das mit dem IO.StreamReader machen löst das Programm eine Ausnahme: System.IO.IOException - Der Prozess kann nicht auf die Datei ""..."" zugreifen, da sie von einem anderen Prozess verwendet wird.
    Ich hätte das ja so hingenommen dass es nicht geht, aber mit Notepad++ kann ich den Text ohne Probleme öffnen. Deshalb meine Frage kann man und wenn Ja wie eine Textdatei auslesen auch wenn sie von einem anderen Prozess verwendet wird?

    Diesen Code habe ich verwendet zum auslesen:

    VB.NET-Quellcode

    1. Using sr As IO.StreamReader = IO.File.OpenText(path)
    2. Do While sr.Peek() >= 0
    3. Text += (sr.ReadLine() & vbCrLf)
    4. Loop
    5. End Using​


    Ich hoffe ihr habt Ideen, schon mal Danke im voraus. MFG
    Probier doch mal Dim LogDataLines = IO.File.ReadAllLines(path)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Während das andere Programm weitere Logeinträge anhängt.
    @SidezockingLP Nimm einen FileSystemWatcher, der Dich über die Änderung der Logdatei informiert.
    Beim Start ist die aktuelle Position 0.
    Öffne die Datei, Seeke zur aktuellen Position.
    Lies den gesamten Rest aus.
    Merke Dur die aktuelle Länge als Position.
    Warte auf die nächste Änderung der Datei.
    ====
    Wenn der andere Prozess die Datei geclaimed hat, müsstest Du eine Shadow Copy erstellen und die auslesen, das ist estwas tricky.
    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!
    @RodFromGermany: Hilf mir bitte auf die Sprünge. Geht es bei Deinem Hinweis darum, dass mein Vorschlag ineffizient ist? Insgesamt dürfte eine Problemlösung davon abhängig sein, wie oft die LogFile ausgelesen werden soll, wie umfangreich sie ist und wie schnell wieviele Daten dazukommen. Der Shadow-copy-Vorschlag hätte m.E. das gleiche Problem wie meiner.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    SidezockingLP schrieb:

    da sie von einem anderen Prozess verwendet wird.
    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!
    Ah, erwischt :S . Wenn falsche Testbedingungen bei mir zu vorschnellen Antworten meinerseits führen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hey, @RodFromGermany
    Erstmal Danke für deine schnelle Antwort, ich habe mir deinen Lösungsvorschlag jetzt mal angeschaut und ausprobiert: Also ich bekomme jetzt keinen Fehler mehr beim auslesen, also dass die Datei von einem anderen Prozess verwendet wird, aber leider bekomme ich beim Konvertieren richtigen Mist heraus, also nur irgendwelche Buchstabenfolgen die keinen Sinn ergeben und nicht so in der Datei stehen. Kannst du dir vielleicht mal meinen Code anschauen , ich denke mal ich habe bei den Konvertierungen einfach Müll gemacht, aber ich kann es mir gerade nicht erklären.

    VB.NET-Quellcode

    1. ​Private Sub logwatcher_Changed(sender As Object, e As FileSystemEventArgs) Handles logwatcher.Changed
    2. Dim text As String = Nothing
    3. Using fs As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read) 'Ok wie du sagtest öffne die Datei, So?
    4. fs.Seek(0, SeekOrigin.Begin) 'aktelle position 0
    5. 'Jetzt zur aktuellen Position durchgehen und die herausgegebenen Bytes speichern
    6. Dim bytes(fs.Length) As Byte 'In der Array speichere ich die Bytes
    7. For i As Integer = 0 To CType(fs.Length, Integer) - 1 'Durchgehen
    8. Dim Akt_Byte_Integer As Integer = fs.ReadByte() 'Check ich net wiso kommen die bytes bei dieser Funktion als Integer
    9. If Not Akt_Byte_Integer = Nothing Then bytes(i) = Convert.ToByte(Akt_Byte_Integer) 'Ich hab leider keinen Plan wie man Integerbytes in Strings wandelt also hab ich es erstmal wieder zu Bytes gemacht
    10. Next i
    11. MsgBox(Convert.ToBase64String(bytes)) 'dann wollte ich es Konvertieren
    12. End Using
    13. End Sub

    SidezockingLP schrieb:

    aber leider bekomme ich beim Konvertieren richtigen Mist heraus
    Was ist denn der Input des Konvertierens?
    Das musst Du als erstes prüfen.
    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!
    @RodFromGermany
    Hab den Code jetzt mal beim ersten Wert Debuggt und die Ergebnisse in den Code geschrieben:

    VB.NET-Quellcode

    1. Private Sub logwatcher_Changed(sender As Object, e As FileSystemEventArgs) Handles logwatcher.Changed
    2. Dim text As String = Nothing
    3. Using fs As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read)
    4. fs.Seek(0, SeekOrigin.Begin)
    5. Dim bytes(fs.Length) As Byte
    6. For i As Integer = 0 To CType(fs.Length, Integer) - 1
    7. Dim Akt_Byte_Integer As Integer = fs.ReadByte() '--> Wert Akt_Byte_Integer = 239
    8. Dim Akt_Byte As Byte = Convert.ToByte(Akt_Byte_Integer) '--> Wert Akt_Byte = 239
    9. If Not Akt_Byte_Integer = Nothing Then bytes(i) = Akt_Byte
    10. Dim S As String = (Convert.ToBase64String(bytes))
    11. '--> Wert S (String) = "7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..."
    12. 'bytes lenght 142
    13. MsgBox(S)
    14. Next i
    15. ' MsgBox(Convert.ToBase64String(bytes))
    16. End Using


    Bei Convert.ToBase64String(bytes) kommen ja diese komischen Zeichenfolgen raus, kennst du denn eine andere Möglichkeit diese Integer Bytes die bei fs.ReadByte() herauskommen in einen String zu wandeln ?
    @SidezockingLP Wie sieht der Logfile aus, wenn Du ihn im Notepad öffnest?
    Ist da lesbarer Text
    oder
    sind da kryptische Zeichen?
    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!

    SidezockingLP schrieb:

    also wie "Hallo Welt"
    Dann lies es als String ein, nicht als Byte().
    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!
    @ErfinderDesRades Also, ich habe einen Filestream der mir meinen Text auslesen soll, doch der gibt mir mit der Funktion Filestream.GetBytes() einen Integer zurück. Ich wusste nicht, wie ich das dann in einen String bekomme, also habe ich den Integer erst mit Convert.ToByte() zu einem Byte gemacht damit ich daraus einen String mit (Convert.ToBase64String(bytes)) bekomme. Doch das Ganze hin und her Konvertieren Funktioniert nicht so und ich bekomme am Ende nur komische Buchstabenfolgen heraus. Deshalb habe ich gefragt ob du oder ihr eine Funktion kennt oder wisst wie ich aus diesem "ByteInteger" einen String mache damit ich am Ende wieder meinen Text habe.

    @RodFromGermany Wie mache ich dass denn? Mit dem Filestream den ich Deklariert habe:

    VB.NET-Quellcode

    1. Using fs As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read)
    habe ich nur die Funktion .GetBytes() As integer

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SidezockingLP“ ()

    @SidezockingLP Probierst Du

    VB.NET-Quellcode

    1. Dim path = ""
    2. Using fs As New StreamReader(path)
    3. Dim line = fs.ReadLine()
    4. '...
    5. End Using
    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!
    Hey @RodFromGermany bei ​Using fs As New StreamReader(path) gibt es das Problem weshalb ich diesen Eintrag gepostet habe, Der Prozess kann nicht auf die Datei ""..."" zugreifen, da sie von einem anderen Prozess verwendet wird. Du hast vorgeschlagen:
    ​Öffne die Datei, Seeke zur aktuellen Position.
    Das Hab ich probiert zu machen. Aber seek ist kein Member von StreamReader.
    @SidezockingLP Na dann probieren wir dies hier:

    VB.NET-Quellcode

    1. Dim path = ""
    2. Using fs As New FileStream(path, FileMode.Open, FileAccess.Read)
    3. fs.Seek(1234, SeekOrigin.Begin)
    4. Using sr As New StreamReader(path)
    5. Dim line = sr.ReadLine()
    6. '...
    7. End Using
    8. End Using
    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!
    @RodFromGermany Das Problem Der Prozess kann nicht auf die Datei ""..."" zugreifen, da sie von einem anderen Prozess verwendet wird verschwindet nicht.

    Aufgeben oder gibt es noch Hoffnung? :)
    Bilder
    • problem.PNG

      18,89 kB, 1.057×158, 114 mal angesehen
    Er hat's doch schon geschrieben: Mach ne Kopie der Datei und werte die aus.
    Meine "Fragen" sind auch noch unbeatwortet:

    VaporiZed schrieb:

    Insgesamt dürfte eine Problemlösung davon abhängig sein, wie oft die LogFile ausgelesen werden soll, wie umfangreich sie ist und wie schnell wieviele Daten dazukommen.

    Aber in Post#7 schriebst Du doch, dass Du auf die Datei ohne Fehler zugreifen konntest:

    SidezockingLP schrieb:

    Also ich bekomme jetzt keinen Fehler mehr beim auslesen, also dass die Datei von einem anderen Prozess verwendet wird
    Nur die Auswertung war eben murks. Also wäre doch sinnvoll, dort weiterzumachen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Mach ne Kopie der Datei und werte die aus.
    Sry war meine Dummheit, ich dachte nicht dass wenn man eine Datei nicht auslesen kann dass man sie dann kopieren kann?! Scheint aber zu funktionieren ich setze mich morgen mal daran und hoffe dass es gelöst ist

    Insgesamt dürfte eine Problemlösung davon abhängig sein, wie oft die LogFile ausgelesen werden soll, wie umfangreich sie ist und wie schnell wie viele Daten dazukommen.

    Umfang vllt bis 100 Zeilen Maximum, Auslesen würde ich gerne in einem Hintergrundtask so alle 10 sek machen, am Anfang kommen sehr viele Daten danach eher langsamer.

    Aber in Post#7 schriebst Du doch, dass Du auf die Datei ohne Fehler zugreifen konntest. Nur die Auswertung war murks:

    Ich schätze ich habe nur das Auslesen probiert ohne anderem Prozess =O