2015-07-24 5 views
6

ist das, was ich tun würde, in einer perfekten Welt:Ist es möglich, einen Dateideskriptor-Cursor in nodejs zurückzuspulen? Diese

fs.open('somepath', 'r+', function(err, fd) { 
    fs.write(fd, 'somedata', function(err, written, string) { 
     fs.rewind(fd, 0) //this doesn't exist 
    }) 
}) 

Dies ist meine aktuelle Implementierung:

return async.waterfall([ 
    function(next) { 
     //opening a file descriptor to write some data 
     return fs.open('somepath', 'w+', next) 
    }, 
    function(fd, next) { 
     //writing the data 
     return fs.write(fd, 'somedata', function(err, written, string) { 
     return next(null, fd) 
     }) 
    }, 
    function(fd, next) { 
     //closing the file descriptor 
     return fs.close(fd, next) 
    }, 
    function(next) { 
     //open again to reset cursor position 
     return fs.open('somepath', 'r', next) 
    } 
], function(err, fd) { 
    //fd cursor is now at beginning of the file 
}) 

Ich habe versucht, die Position zurückgesetzt werden, ohne dass die fd Schließen unter Verwendung:

fs.read(fd, new Buffer(0), 0, 0, 0, fn) 

aber dies wirft Error: Offset is out of bounds.

Gibt es eine Möglichkeit, den Cursor zurücksetzen, ohne diese schrecklichen hack?

/e: Der Offset ist außerhalb der Grenzen Fehler kommt von this exception. Leicht zu beheben, indem eine Puffergröße auf 1 gesetzt wird, aber der Cursor nicht zurückgespult wird. Vielleicht, weil wir die Funktion bitten, nichts zu lesen.

+1

Warum verwenden Sie nicht das Argument "Position" Funktionen lesen/schreiben? –

+1

Ich brauche sie nicht, ich benutze [diese Funktion] (https://nodejs.org/api/fs.html#fs_fs_write_fd_data_position_encoding_callback) zu schreiben und 'Position' Argument ist optional. Ich möchte nur einige Daten in eine Datei schreiben und einen Dateideskriptor mit einem Cursor an der Position 0 zurückgeben. – soyuka

Antwort

1

Heute ist die Antwort, dass es nicht im Kern ist, und dass es nicht mit reinem Javascript hinzugefügt werden kann.

Es gibt eine Erweiterung node-fs-ext, die eine seek Funktion hinzufügt, um den fd-Cursor zu verschieben. Dies geschieht in C++ here.

In Verbindung stehend Stackoverflow question.

+1

fs-ext scheint unter v4.1.1 kaputt zu sein. –

+0

In der Tat, und es [wird auch nicht mit 4.0 arbeiten] (https://github.com/baudehlo/node-fs-ext/issues/51). Ich verwende immer noch meine Problemumgehung. – soyuka

+0

Nach weiteren Untersuchungen und Gesprächen mit dem Betreuer ist das Problem mit Nan2.0 (was sich unter v4.0 + erheblich geändert hat). Der Repo wurde verzweigt, um dies zu unterstützen und kann mit npm direkt von GitHub installiert werden, bis die Änderungen wieder in Mainline zusammengeführt werden. 'npm install -g Git + https: // github.com/ggreer/node-fs-ext.git # nan_2' –

1

NodeJS v6.5.0 hat die createReadStream-Methode, die eine Reihe von Optionen akzeptiert. Zu diesen Optionen gehören die start und end Eigenschaften. Diese Eigenschaften bestimmen von und bis, welche Zeile gelesen werden sollte. Wenn Sie also start auf 0 setzen, wird die Datei aus der ersten Zeile gelesen. Wenn Sie in diesem Fall end leer lassen, liest der Stream die Datei bis zum Ende.

Als Beispiel:

fs.createReadStream('myfile.txt', {start: 0}) 

diesen Lesestrom Mit Ihnen erlauben würde, die gesamte Datei zu lesen.

+1

Dies hat nichts mit Streams zu tun, sondern mehr mit der Steuerung des Cursors. Genauer gesagt ist es eine Bindung an ['lseek'] (http://man7.org/linux/man-pages/man2/lseek.2.html) (zB in fs-ext). – soyuka

+1

Ich stimme zu. Ich würde auch gerne eine Lösung dafür sehen, aber das war bisher meine Lösung. –

+0

'Start' und' Ende' sind Byte-Offsets, nicht Zeilennummer. Ref: https://nodejs.org/api/fs.html#fs_fs_create_readstream_path_options –

Verwandte Themen