ho fatto una semplice download dal http funzione di seguito (la gestione degli errori è omesso per simplifcation):fs.createWriteStream non crea immediatamente il file?
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);
})
});
}
Tuttavia, come lo chiamo io download()
decine di volte in modo asincrono, esso segnala raramente errore fs.renameSync
lamentarsi esso impossibile trovare il file a tempFile.path
.
Error: ENOENT, no such file or directory 'xxx'
Ho utilizzato lo stesso elenco di URL per testarlo e non è riuscito circa il 30% del tempo. Lo stesso elenco di URL ha funzionato quando scaricato uno per uno.
prova un po ', ho scoperto che il seguente codice
fs.createWriteStream('anypath');
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
console.log(fs.exist('anypath'));
non sempre la stampa true
, ma a volte le prime stampe risposta false
.
Sospetto che troppe chiamate asincrone fs.createWriteStream
non possano garantire la creazione del file. È vero? Esistono metodi per garantire la creazione di file?
In qualche modo, questo frammento di codice non scaricare alcuni degli ultimi byte. Invece, ascolto 'finish' su' tempFile' ora e 'res.pipe (tempFile)' invece di farlo manualmente. –
La [fonte fs.js] (https://github.com/joyent/node/blob/master/lib/fs.js#L1690) indica che non è necessario attendere l'evento "open" prima chiamando 'write' nello stream di scrittura, poiché viene gestito internamente. – MikeM
'open' è effettivamente gestito internamente, ma è asincrono, il file non è aperto fino a quando non viene emesso l'evento' open'. –