在node.js中删除文件不起作用
Posted
技术标签:
【中文标题】在node.js中删除文件不起作用【英文标题】:Deleting file in node.js not working 【发布时间】:2016-09-16 00:09:15 【问题描述】:我正在使用带有 Express 的 Node.js。 我正在尝试使用 express 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);
);
但是文件没有被删除。似乎该进程仍在使用文件,因为就在我结束该进程后,该文件被删除了。
谁能告诉我为什么? 如果我做错了,请告诉我一个好方法。
【问题讨论】:
unlink() 从文件系统中删除一个名称。如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它正在使用的空间可供重用。来源:man7.org/linux/man-pages/man2/unlink.2.html 【参考方案1】:请在deleteFile中添加一个日志,确保它被调用。
试着简化一下:
var fileName = "a.pdf"
var stream = fs.createReadStream(fileName);
stream.pipe(res);
res.once("finish", function ()
deleteFile(fileName);
);
前面的例子只在下载完成后删除文件, 如果您想无条件删除文件,请尝试以下操作:
var fileName = "a.pdf";
var stream = fs.createReadStream(fileName);
stream.pipe(res).once("close", function ()
stream.close();
deleteFile(fileName);
);
stream.close() 在这里很重要,因为如果管道中止,流不会关闭。
【讨论】:
非常感谢您的回答。我将登录放入deleteFile。该函数被调用。但是当客户端中止连接时,不会调用 res.once 函数。成功完成后,它会被调用。 如果您需要确保文件被删除,即使请求被中止,您可以在 res 上使用“close”事件而不是“finish”事件。或者在stream.pipe(res)之后直接调用deleteFile(filename),这样可以避免多个用户同时下载同一个文件,当stream关闭时,底层文件会从文件系统中删除。 但是如果客户端没有读取,流不会关闭。即使客户端关闭连接,流也不会关闭,因此文件不会被删除。当我停止服务器时,它会关闭流并删除文件。 如果管道中止,流不会关闭,请查看修改后的答案中的下一个代码片段。 我创建了一个要点,请看一下:gist.github.com/tangxinfa/ceaf31d8c14231617cf05dc7a6b2555c以上是关于在node.js中删除文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章