以前の質問fs.createReadStream()
では、node.js でファイルからランダム アクセス読み取りを行う唯一の方法は、オプションfd
の 、start
、およびend
フィールドを使用することであると思われました。
これは、私の最も単純なテストではうまくいきました。しかし、私のプロジェクトでは、バイナリ ファイルのさまざまなオフセットから繰り返し読み取る必要があります。これは奇妙な方法で失敗したので、最小限のテスト ケースを考え出しました。
var fs = require('fs');
fs.open('test.txt', 'r', function (err, fd) {
if (err) {
console.error('error opening file: ' + err);
} else {
fs.createReadStream(null, {fd: fd, start: 2, end: 5}).on('error', function (err) {
throw e;
}).on('close', function () {
console.log('outer close');
}).on('data', function (data) {
console.log('outer data', data);
}).on('end', function () {
console.log('outer end');
fs.createReadStream(null, {fd: fd, start: 0, end: 3}).on('error', function (err) {
throw e;
}).on('close', function () {
console.log('inner close');
}).on('data', function (data) {
console.log('inner data', data);
}).on('end', function () {
console.log('inner end');
// more code to execute after both reads
});
});
}
});
内部end
イベントは受信されません。(アウターclose
はバラバラに入荷していますが、コードを付ける必要はありません。)
このプロジェクトは以前に Perl で実装したこともあり、Firefox 拡張機能として JavaScript で実装したこともありますが、node の下では難しいことがわかりました。これは、汎用スクリプト言語として node.js を使い始めることができるかどうかのテストでもあります。