2016-05-19 9 views
0

Ich benutze Node.js mit Express. Ich versuche eine Datei zu löschen, nachdem ich sie mit Express js an den Client gesendet habe.Löschen der Datei in node.js funktioniert nicht

function deleteFile (file) { 
    fs.unlink(file, function (err) { 
     if (err) { 
      logger.error(err); 
     } 
    }); 
} 

app.get("/deleteFileAfterDownload", function (req, res){ 
    var fileName = "a.pdf" 
    var stream = fs.createReadStream(fileName); 
    var streamClosed = false; 
    req.on('end',function(){ 
     if (!streamClosed){ 
      stream.emit('close'); 
      // I tried stream.destroy() but that is also not working 
     } 
    }); 
    stream.on('close', function() { 
     streamClosed = true; 
     deleteFile(fileName); 
    }); 
    req.on('data', function(){}); 
    stream.pipe(res); 
}); 

Aber die Datei wird nicht gelöscht. Es scheint, dass der Prozess immer noch Datei verwendet, weil die Datei gelöscht wird, nachdem ich den Prozess beendet habe.

Kann mir jemand sagen warum? Wenn ich es falsch mache, sag mir bitte einen guten Weg.

+0

unlink() löscht einen Namen aus dem Dateisystem. Wenn dieser Name der letzte Link zu einer Datei ist und keine Prozesse die Datei geöffnet haben, wird die Datei gelöscht und der verwendete Speicherplatz wird für die Wiederverwendung verfügbar gemacht. Quelle: http://man7.org/linux/man-pages/man2/unlink.2.html – n32303

Antwort

2

Bitte loggen Sie sich in deleteFile ein, damit es aufgerufen wird.

Ausprobieren vereinfachen:

var fileName = "a.pdf" 
var stream = fs.createReadStream(fileName); 
stream.pipe(res); 
res.once("finish", function() { 
    deleteFile(fileName); 
}); 

Im vorherigen Beispiel nur Datei löschen, wenn Download abgeschlossen, wenn Sie Datei löschen möchten unconditionly, versuchen Sie folgendes:

var fileName = "a.pdf"; 
var stream = fs.createReadStream(fileName); 
stream.pipe(res).once("close", function() { 
    stream.close(); 
    deleteFile(fileName); 
}); 

stream.close() ist wichtig hier, weil Stream nicht geschlossen, wenn Pipe abgebrochen wird.

+0

Vielen Dank für Ihre Antwort. Ich logge deleteFile ein. Die Funktion wird aufgerufen. Die Funktion res.once wird jedoch nicht aufgerufen, wenn der Client die Verbindung abbricht. Bei erfolgreichem Abschluss heißt es. – Harikrishnan

+0

Wenn Sie brauchen, dass die Datei "Datei" gelöscht wird, selbst wenn die Anfrage abgebrochen wird, können Sie das Ereignis "Schließen" anstelle des Ereignisses "Beenden" für die Datei res verwenden. Oder rufen Sie deleteFile (Dateiname) direkt nach stream.pipe (res) auf, dies kann verhindern, dass mehrere Benutzer gleichzeitig dieselbe Datei herunterladen, wenn der Stream geschlossen wird, wird die Underlayer-Datei aus dem Dateisystem gelöscht. – tangxinfa

+0

Aber der Stream wird nicht geschlossen, wenn der Client nicht liest. Selbst wenn der Client die Verbindung schließt, wird der Stream nicht geschlossen, und daher wird die Datei nicht gelöscht. Wenn ich den Server stoppe, wird der Stream geschlossen und Dateien werden gelöscht. – Harikrishnan