在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中删除文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Node.JS:fs.readFile 在 Ubuntu 上不起作用

Node js csrf令牌保护不起作用

邮递员的简单删除请求不起作用

为啥 GET 请求在 Node.js 中不起作用?

node.js的简单服务器测试不起作用,没有输出[重复]

***等待在最新的 Node.js 中不起作用