2016-06-03 6 views
1

Ich schrieb den folgenden Code ein Hash einer Datei zu erstellen:Warum wird die Filestream-Funktion am Ende nicht

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

Dies funktionierte gut, bis ich einige kleinere Dateien auf sie warf. Wenn ich das tat, würde die Funktion einfach hängen. Der Rückruf filestream.on('end') würde niemals passieren.

Ich schrieb es nicht createReadStream verwenden:

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

Dieser Code funktioniert gut, außer es auf Dateien, die ein paar MB oder größer unglaublich langsam ist sind.

Meine Frage ist, warum funktioniert die erste Funktion nicht auf kleinen Dateien?

+0

Haben Sie versucht, das Ereignis vor dem Aufruf der Pipe einzurichten? Nur eine Idee, ich weiß nicht wirklich was los ist. – Havenard

Antwort

0

Also nach der Suche nach der Antwort den ganzen Abend, fand ich es 15 Minuten nach dem Schreiben dieses Beitrags. Der 'Ende'-Callback muss vor dem Aufruf der Pipe konfiguriert werden:

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); 
Verwandte Themen