fs.unlink 不会删除文件

Posted

技术标签:

【中文标题】fs.unlink 不会删除文件【英文标题】:fs.unlink doesn't delete the file 【发布时间】:2014-06-07 03:41:29 【问题描述】:

在我的 Express 服务器上,我想获取用户上传的文件并将其重命名以匹配他们的用户名。如果用户名上传新文件,则替换之前的文件。

代码如下:

  var newPath = 'uploads/' + user.username + '.' + (file.extension).toLowerCase();
  var basePath = path.resolve(__dirname + '../../../') + '/';

  // Copy, rename and delete temp file
  var is = fs.createReadStream(basePath + file.path);
  var os = fs.createWriteStream(basePath + newPath);

  is.pipe(os);
  is.on('end', function (error) 
    if (err) return res.send(500);
    fs.unlink(basePath + file.path);
  );

问题是fs.unlink(basePath + file.path); 实际上并没有删除我机器上的旧文件(OSX 10.9.2)。如何确保删除临时文件?

【问题讨论】:

只使用一个fs.rename 调用更简单,不是吗? @PeterLyons 尝试过,但遇到了同样的问题。 您是否尝试向fs.unlink() 添加回调以查看是否设置了err?此外,您可能希望为文件可读流侦听“关闭”而不是“结束”,因为这表明支持 fd 实际上已关闭。 【参考方案1】:

文件basePath + file.path 具有读取流is 的链接引用。文件内容的删除应推迟到对文件的所有引用都关闭为止。您可能想在 close 事件上调用 fs.unlink

【讨论】:

另请注意,如果您使用的是 fs.readFileSync,请不要将文件名作为字符串传递。它不会自动关闭它。因此,如果您要创建一个临时文件,请使用 let fd = fs.openSync(fileName); responseFileContents = fs.readFileSync(fd, 'utf8'); 通过将整数传递给 fs.readFileSync 来确保它关闭。延伸阅读:github.com/nodejs/node/blob/…【参考方案2】:

我只是使用fs.writeFile 覆盖一个文件。我的应用程序中有代码同步到这个,但它看起来像这样:

if( !fs.existsSync( filename ) )  fs.openSync( filename, "wx" );
fs.writeFileSync( filename, data );

基本上我会检查文件是否存在,如果不存在,我会打开它。然后,我只是写入文件。如果它是新的或已经存在的,当我查看它时,只有我的data 存在于文件中,覆盖那里的内容。

【讨论】:

调用 existsSync,然后 openSync 不好 - 可以在两次调用之间删除文件。writeFile 的文档说“将数据写入文件,如果文件已经存在则替换文件”(writeFileSync 是只是一个同步版本)。如果没有 existsSync 或 openSync,这难道不是你想要的吗?

以上是关于fs.unlink 不会删除文件的主要内容,如果未能解决你的问题,请参考以下文章

node 删除文件 和文件夹

nodejs删除安卓手机指定文件

Node.js——fs模块(文件系统),创建删除目录(文件),读取写入文件流

nodejs 学习

node实现 删除某目录下所有同名文件夹及其子文件内容

nodejs之fs模块