2016-05-19 5 views
0

ExpressでNode.jsを使用しています。 ファイルをexpress jsでクライアントに送信した後にファイルを削除しようとしています。node.js内のファイルを削除できない

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

ただし、ファイルは削除されません。プロセスを終了した直後にファイルが削除されているため、プロセスはまだファイルを使用しているようです。

なぜ誰に教えてもらえますか? 私が間違っている場合は、良い方法を教えてください。

+0

unlink()は、ファイルシステムから名前を削除します。その名前がファイルへの最後のリンクであり、プロセスがファイルを開いていない場合、そのファイルは削除され、使用していたスペースは再利用できるようになります。出典:http://man7.org/linux/man-pages/man2/unlink.2.html – n32303

答えて

2

deleteFileにログを追加してください。それが呼び出されます。

それを単純化してみてください。ダウンロードが終了した場合

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

前の例では、ファイルのみを削除し、 あなたがunconditionlyファイルを削除したい場合は、以下を試してみてください。

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

stream.close()されますここで重要なのは、パイプが中止された場合にストリームが閉じないためです。

+0

ありがとうございます。私はdeleteFileにログを記録します。関数が呼び出されています。しかし、クライアントが接続を中断したときにres.once関数が呼び出されることはありません。正常終了時に呼び出されます。 – Harikrishnan

+0

リクエストが中止されてもmakeureファイルが削除される必要がある場合、resの "finish"イベントの代わりに "close"イベントを使用することができます。 stream.pipe(res)の直後にdeleteFile(filename)を呼び出すと、複数のユーザが同じファイルを同時にダウンロードすることを避けることができます。ストリームが閉じるとファイルシステムから下層ファイルが削除されます。 – tangxinfa

+0

しかし、クライアントが読んでいない場合、ストリームは閉じられません。クライアントが接続を閉じても、ストリームは閉じていないので、ファイルは削除されません。サーバーを停止すると、ストリームが閉じられ、ファイルが削除されます。 – Harikrishnan

関連する問題