I wie unten einen einfachen Download von http Funktion gemacht habe (Fehlerbehandlung für simplifcation weggelassen):fs.createWriteStream erstellt nicht sofort eine Datei?
function download(url, tempFilepath, filepath, callback) {
var tempFile = fs.createWriteStream(tempFilepath);
http.request(url, function(res) {
res.on('data', function(chunk) {
tempFile.write(chunk);
}).on('end', function() {
tempFile.end();
fs.renameSync(tempFile.path, filepath);
return callback(filepath);
})
});
}
Da ich jedoch asynchron download()
zig-mal nennen, es es selten berichtet beschweren Fehler auf fs.renameSync
Datei kann unter tempFile.path
nicht gefunden werden.
Error: ENOENT, no such file or directory 'xxx'
Ich benutzte die gleiche Liste von URLs, um es zu testen, und es scheiterte etwa 30% der Zeit. Die gleiche Liste von URLs funktionierte, wenn sie nacheinander heruntergeladen wurden.
Testing etwas mehr, fand ich heraus, dass der folgende Code
fs.createWriteStream('anypath');
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
immer true
nicht gedruckt wird, aber manchmal sind die erste Antwort druckt false
.
Ich vermute, dass zu viele asynchrone fs.createWriteStream
Aufrufe die Dateierstellung nicht garantieren können. Ist das wahr? Gibt es Methoden, um die Erstellung von Dateien zu garantieren?
Irgendwie dieser Code-Snippet downloaden nicht einige des letzten Bytes. Statt dessen höre ich "finish" auf "tempFile" jetzt und "res.pipe (tempFile)" anstatt es manuell zu machen. –
Die [fs.js Quelle] (https://github.com/joyent/node/blob/master/lib/fs.js#L1690) zeigt an, dass es nicht nötig ist, vorher auf das "open" Ereignis zu warten ruft 'write' auf den Schreibstrom auf, da dies intern behandelt wird. – MikeM
'open' wird in der Tat intern behandelt, aber es ist async, die Datei ist nicht offen, bis das' open' Ereignis ausgelöst wird. –