2016-06-03 4 views
1

Я написал следующий код, чтобы создать хэш файла:Почему функция FileStream не заканчивается

function hashFile(filePath){ 
    try{ 
    // Setup hash 
    var hash = crypto.createHash('sha256'); 
    hash.setEncoding('hex'); 

    // Setup filestream 
    var fileStream = fs.createReadStream(filePath); 
    fileStream.pipe(hash, { end: false }); 

    fileStream.on('end', function() { 
     // Get the hash 
     hash.end(); 
     var thisHash = String(hash.read()); 
    }); 
    }catch (err) { 
    console.log("Error thrown : " + err); 
    return; 
    } 
} 

Это работало нормально, пока я не бросил несколько файлов меньшего размера на него. Когда я это сделал, функция просто зависала. Обратный вызов filestream.on('end') никогда не произойдет.

я переписал его не использовать createReadStream:

function hashFile(filePath){ 
    try{ 
    fs.readFile(filePath, function (err, data) { 

     // Make the hash 
     var thisHash = crypto 
     .createHash('sha256') 
     .update(data, 'utf8') 
     .digest('hex'); 

     console.log(thisHash); 
    }); 
    }catch (err) { 
    console.log("Error: " + err); 
    return; 
    } 
} 

Этот код работает просто отлично, за исключением того, что это невероятно медленно на файлы, которые несколько мегабайт или больше.

Мой вопрос: почему первая функция не работает на небольших файлах?

+0

Вы пытались настроить событие перед вызовом трубки? Просто идея, я действительно не знаю, что происходит. – Havenard

ответ

0

Так что после поиска ответа весь вечер, я понял это через 15 минут после написания этого сообщения. Обратный вызов «конец» должен быть сконфигурирован до вызова канала:

var fileStream = fs.createReadStream(filePath); 

var hash = crypto.createHash('sha256'); 
hash.setEncoding('hex'); 

fileStream.on('end', function() { 
    hash.end(); 
    console.log(hash.read()); 
}); 

fileStream.pipe(hash); 
Смежные вопросы