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