【问题标题】:fs.unlink doesn't delete the filefs.unlink 不会删除文件
【发布时间】: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 实际上已关闭。

标签: node.js express fs


【解决方案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,这难道不是你想要的吗?
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2019-12-23
  • 2021-12-01
相关资源
最近更新 更多