Ich versuche, eine Routine für Node.js zu implementieren, die es ermöglicht, eine Datei zu öffnen, die gerade von einem anderen Prozess angehängt wird, und dann sofort Datenstücke zurückgibt, während sie angehängt werden Datei. Es kann als ähnlich dem Befehl tail -f
UNIX betrachtet werden, wirkt jedoch sofort, wenn Chunks verfügbar sind, anstatt im Laufe der Zeit nach Änderungen zu suchen. Alternativ kann man sich das so vorstellen, als würde man mit einer Datei arbeiten, so wie man es mit Socket macht - man erwartet on('data')
von Zeit zu Zeit auszulösen, bis die Datei explizit geschlossen wird.
Wenn ich dies implementieren würde, würde ich einfach Datei öffnen, den Dateideskriptor auf select()
(oder eine alternative Funktion mit ähnlicher Bezeichnung) füttern und dann nur die Abschnitte lesen, wenn der Dateideskriptor als "lesbar" markiert ist ". Wenn also nichts zu lesen ist, wird es nicht lesbar sein, und wenn etwas an die Datei angehängt wird, ist es wieder lesbar.
Ich habe diese Art von Verhalten für folgendes Code-Beispiel in Javascript erwartet:
%Vor% Dieses Code-Beispiel wird jedoch nur bei EOF ausgeblendet, sodass ich nicht auf die Ankunft eines neuen Chunks warten kann. Natürlich könnte ich dies mit fs.open
und fs.read
neu implementieren, aber das macht Node.js
absichtlich etwas überflüssig. Alternativ könnte ich fs.watch()
file für Änderungen verwenden, aber es wird nicht über das Netzwerk funktionieren, und ich mag es nicht, die Datei immer wieder zu öffnen, statt sie nur offen zu halten.
Ich habe das versucht:
%Vor% Aber hatte kein Glück - net.Socket
ist nicht glücklich und wirft TypeError: Unsupported fd type: FILE
.
Also, irgendwelche Lösungen?
Ich habe die Interna der Lesestreams für Dateien nicht untersucht, aber es ist möglich, dass sie nicht darauf warten, dass eine Datei mehr Daten enthält. Das fs
-Paket unterstützt dies jedoch definitiv mit seinen grundlegendsten Funktionen.
Um zu erklären, wie Tailing funktionieren würde, habe ich eine etwas hacky tail
-Funktion geschrieben, die eine ganze Datei liest und einen Callback für jede Zeile aufruft (getrennt durch \n
) und dann auf die Datei wartet mehr Zeilen geschrieben. Beachten Sie, dass dies eine effizientere Möglichkeit wäre, einen Zeilenpuffer fester Größe zu haben und nur Bytes hineinzuschieben (mit einem Sonderfall für extrem lange Zeilen), anstatt JavaScript-Strings zu ändern.
Alles in allem sollten Sie auch versuchen, die NPM-Gemeinschaft zu stärken. Mit etwas Suchen fand ich das Schwanz-Stream -Paket, das mit Streams machen könnte, was du willst.
>In früheren Antworten wurde der Ansatz tail-stream erwähnt, der fs.watch, fs.read und fs verwendet. Stat zusammen, um den Effekt des Streams des Dateiinhalts zu erzeugen. Sie können diesen Code in Aktion hier sehen.
Ein anderer, vielleicht hackererer Ansatz könnte darin bestehen, einfach den Schwanz zu benutzen, indem ein Kindprozess damit erzeugt wird. Dies ist natürlich mit der Einschränkung verbunden, dass Tail auf der Zielplattform existieren muss, aber eine der Stärken des Knotens ist es, asynchrone Systementwicklung via Spawn durchzuführen und sogar unter Windows können Sie Knoten in einer alternativen Shell wie msysgit oder cygwin ausführen Zugriff auf das Tail-Dienstprogramm.
Der Code dafür:
%Vor%Was Sie versuchen, ist eine FIFO-Datei (Akronym für First In First Out), die, wie Sie sagten, wie ein Socket funktioniert.
Es gibt ein Modul node.js, mit dem Sie mit fifo Dateien arbeiten können.
Ich weiß nicht, wofür Sie das wollen, aber es gibt bessere Möglichkeiten, mit Sockets auf node.js zu arbeiten. Probieren Sie stattdessen socket.io .
Sie können sich auch diese vorherige Frage ansehen: Lesen einer Datei in Echtzeit mit Node.js
Update 1
Ich bin mit keinem Modul vertraut, das mit einer normalen Datei das tut, was Sie wollen, statt mit einem Socket-Typ. Aber wie du gesagt hast, könntest du tail -f
benutzen, um den Trick zu machen:
Dann probiere von der Kommandozeile echo someline > somefile.txt
und beobachte die Konsole.
Vielleicht möchten Sie auch einen Blick darauf werfen: Ссылка
Tags und Links javascript file-io node.js