2015-07-24 9 views
6

To jest to, co chciałbym robić w idealnym świecie:Czy można przewinąć kursor deskryptora pliku do nodejs?

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

To moja obecna implementacja:

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 
}) 

Próbowałem zresetować pozycję bez zamykania fd za pomocą:

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

ale to powoduje, że jest to Error: Offset is out of bounds.

Czy istnieje sposób na zresetowanie kursora bez robienia tego okropnego hack?

/e: Przesunięcie jest poza granicami błędu pochodzi z this exception. Łatwo ustalić, ustawiając rozmiar bufora na 1, ale nie przewija on kursora. Może dlatego, że prosimy o funkcję, aby nic nie czytać.

+1

Dlaczego nie używasz argumentu "pozycja" funkcje odczytu/zapisu? –

+1

Nie potrzebuję ich, używam [tej funkcji] (https://nodejs.org/api/fs.html#fs_fs_write_fd_data_position_encoding_callback) do zapisu, a argument "position" jest opcjonalny. Chcę tylko zapisać dane w pliku i uzyskać deskryptor pliku z kursorem na pozycji 0. – soyuka

Odpowiedz

1

Dziś odpowiedź brzmi, że nie znajduje się w jądrze i nie można go dodać z czystym javascript.

Istnieje rozszerzenie node-fs-ext, które dodaje funkcję seek, aby przesunąć kursor fd. Odbywa się to w C++ here.

Powiązane Stackoverflow question.

+1

fs-ext wydaje się być zepsuty pod v4.1.1. –

+0

Rzeczywiście, i to [nie będzie działać z 4.0 albo] (https://github.com/baudehlo/node-fs-ext/issues/51). Nadal używam mojego obejścia. – soyuka

+0

Po dalszych badaniach i rozmowie z opiekunem, problem dotyczy Nan2.0 (który znacznie zmienił się w wersji 4.0). Repo zostało rozgałęzione, aby to wspierać i można je zainstalować z npm bezpośrednio z github, dopóki zmiany nie zostaną połączone z powrotem do mainline. 'npm install -g git + https: // github.com/ggreer/node-fs-ext.git # nan_2' –

1

NodeJS v6.5.0 ma metodę createReadStream, która przyjmuje tablicę opcji. Wśród tych opcji są właściwości: start i end. Te właściwości określają odpowiednio: od i do.

Jeśli więc ustawisz start na 0, odczytany zostanie plik z pierwszego wiersza. Pozostawienie pustego w tym przypadku spowoduje, że strumień będzie czytał plik do końca.

Jako przykład:

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

Stosując ten strumień odczytu pozwoli Ci odczytać cały plik.

+1

Nie ma to nic wspólnego ze strumieniami, ale raczej ze sterowaniem wskaźnikiem kursora pliku. Dokładniej, jest to wiązanie do ['lseek'] (http://man7.org/linux/man-pages/man2/lseek.2.html) (na przykład w fs-ext). – soyuka

+1

Zgadzam się. Chciałbym również znaleźć rozwiązanie tego problemu, ale na razie było to moje obejście. –

+0

'start' i' end' to przesunięcia bajtów, a nie numer wiersza. Ref: https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options –

Powiązane problemy