c # kontinuierlich gelesene Datei
Ich Lesen möchte-Datei kontinuierlich wie bei GNU-tail mit "-f" param. Ich brauche es um zu Leben-Lesen-log-Datei.
Was ist der richtige Weg, es zu tun?
InformationsquelleAutor der Frage Dmytro Leonenko | 2010-09-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du willst eine
FileStream
im Binär-Modus. In regelmäßigen Abständen suchen am Ende der Datei minus von 1024 bytes (oder was auch immer), dann bis zum Ende Lesen und Ausgang. Das ist, wietail -f
funktioniert.Antworten auf Ihre Fragen:
Binären weil es schwierig ist, zufällig auf die Datei zugreifen, wenn Sie Lesen es als text. Sie haben, um die Binär-zu-text-Konvertierung selbst, aber es ist nicht schwer. (Siehe unten)
1024 bytes, weil es eine schöne günstige Nummer und sollte in der Lage 10 oder 15 Zeilen text. In der Regel.
Hier ist ein Beispiel für die Datei öffnen, Auslesen der letzten 1024 bytes, und konvertiert Sie in text:
Beachten Sie, dass müssen Sie öffnen Sie mit
FileShare.ReadWrite
da Sie versuchen, eine Datei Lesen, die gerade zum schreiben geöffnet von einem anderen Prozess.Beachten Sie auch, dass ich verwendet
Encoding.Default
die in US/Englisch und die meisten westeuropäischen Sprachen wird ein 8-bit-Zeichenkodierung. Wenn die Datei geschrieben ist, in einer anderen Kodierung (wie UTF-8 oder einer anderen Unicode-Codierung), ist Es möglich, dass die bytes nicht korrekt konvertiert werden zu Zeichen. Sie müssen verarbeiten, dass durch die Bestimmung der Codierung, wenn Sie denken, dass dies ein problem sein wird. Suche Stack overflow für die info über die Feststellung einer Datei die text-Codierung.Wenn Sie möchten, tun Sie dies in regelmäßigen Abständen (alle 15 Sekunden, zum Beispiel), können Sie einen timer einrichten, dass Anrufe auf die
ReadTail
- Methode so oft wie Sie wollen. Sie könnten optimieren die Dinge ein wenig, öffnen Sie die Datei nur einmal beim start des Programms. Das ist bis zu Ihnen.InformationsquelleAutor der Antwort Jim Mischel
Mehr Natürliche Ansatz mit
FileSystemWatcher
:Hier die Haupt-lese-Zyklus Stoppt, um zu warten, bis eingehende Daten und
FileSystemWatcher
ist verwendet, um nur wach, der Haupt-Lesen-Zyklus.InformationsquelleAutor der Antwort tsul
Kontinuierlich zu überwachen, der Schwanz der Datei, die Sie gerade benötigen, zu erinnern, die Länge der Datei vor.
Musste ich ASCIIEncoding, weil dieser code nicht schlau genug, um sorgen für variable character Längen von UTF8 auf Puffer-Grenzen.
Hinweis: Sie können ändern Sie den Thread.Schlaf-Teil zu verschiedenen Zeiten, und Sie können auch verbinden Sie es mit einem filewatcher und blockierende Muster - Monitor.Geben/Warten/Puls. Für mich ist der timer ist genug, und bei den meisten ist es nur überprüft die Länge der Datei in jeder Sekunde, wenn die Datei nicht geändert hat.
InformationsquelleAutor der Antwort Todd
Könnten Sie die FileSystemWatcher Klasse die können das senden von Benachrichtigungen für verschiedene Ereignisse auf dem Datei-system wie eine Datei geändert.
InformationsquelleAutor der Antwort Darin Dimitrov
Dies ist meine Lösung
so, in Ihrem code können Sie tun
InformationsquelleAutor der Antwort Johann Medina
InformationsquelleAutor der Antwort coolcake
Wenn Sie gerade auf der Suche für ein Werkzeug, dies zu tun, dann schauen Sie sich die Kostenlose version von Nackte Schwanz
InformationsquelleAutor der Antwort Snak3byte