6

イベント駆動型プログラミングの基本を学ぼうとしています。そのため、演習として、大きなバイナリ ファイルを読み取り、それに対して何かを実行するプログラムを作成しようとしていますが、ブロッキング呼び出しを行うことはありません。私は次のことを思いつきました:

var fs = require('fs');
var BUFFER_SIZE = 1024;
var path_of_file = "somefile"

fs.open(path_of_file, 'r', (error_opening_file, fd) =>
{
    if (error_opening_file)
    {
        console.log(error_opening_file.message);
        return;
    }

    var buffer = new Buffer(BUFFER_SIZE);
    fs.read(fd, buffer, 0, BUFFER_SIZE, 0, (error_reading_file, bytesRead, buffer) =>
    {
        if (error_reading_file)
        {
            console.log(error_reading_file.message);
            return;
        }

        // do something e.g. print or write to another file
    })
})

完全なファイルを読み取るために while ループを配置する必要があることはわかっていますが、上記のコードでは、ファイルの最初の 1024 バイトだけを読み取っているため、ブロッキング ループを使用せずにファイルの読み取りを続行する方法を定式化することはできません。どうすればそれができますか?

4

1 に答える 1

8

代わりにfs.createReadStreamを使用してください。これにより、ファイルの読み取りが完了するまでコールバックが何度も呼び出されるため、ブロックする必要はありません。

var fs = require('fs');

var readStream = fs.createReadStream('./test.exe');
readStream.on('data', function (chunk) {
  console.log(chunk.length);
})
于 2016-03-21T21:35:38.857 に答える