2016-03-21 8 views
3

Я пытаюсь изучить некоторые основы программирования, управляемого событиями. Поэтому для упражнения я пытаюсь написать программу, которая читает большой двоичный файл и что-то делает с ним, но без блокирующего вызова. Я пришел со следующими:Как читать большие двоичные файлы в узле js без цикла блокировки?

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

Я знаю, что нужно поставить время цикла, чтобы прочитать полный файл, но в коде выше я читал только первые 1024 байт файла и не может сформулировать, как продолжить чтение файла без использования цикла блокировки. Как мы можем это сделать?

ответ

6

Использовать вместо fs.createReadStream. Это вызовет ваш обратный вызов снова и снова, пока он не закончит чтение файла, поэтому вам не нужно блокировать.

var fs = require('fs'); 

var readStream = fs.createReadStream('./test.exe'); 
readStream.on('data', function (chunk) { 
    console.log(chunk.length); 
}) 
+0

Hey rgvassar Спасибо за ваш ответ. Сколько данных он считывает за один раз? Не выполняет ли эта функция полный файл в памяти? Разве это не предназначено для чтения текстовых файлов? –

+1

Я ошибался. 'ReadFile' читает весь файл за один раз. Я отредактировал свой ответ, чтобы использовать 'createReadStream', который будет передавать обратно куски. Каждый кусок составляет 65536 байт. Ни 'readFile', ни' createReadStream' не ограничиваются только текстовыми файлами. Они могут читать файлы любого типа. – rgvassar