根据文档,node.js中的fs.exists()将被弃用。
他们的理由是:
fs.exists()已经过时,仅出于历史原因而存在。在自己的代码中几乎没有理由使用它。
特别是,在打开文件之前检查文件是否存在是一种反模式,会让您容易受到竞态条件的影响:另一个进程可能会在调用fs.exists()和fs.open()之间删除该文件。只需打开文件,当文件不存在时处理错误即可。
fs.exists()将被弃用。
我目前在移动文件之前使用它,因为fs.rename()似乎会悄悄地覆盖目标文件夹中同名的文件。
我的问题是:我应该使用什么来防止fs.rename()覆盖目标文件夹中的文件? 我认为有一种我不知道的方法。否则,我看不出fs.exists()被弃用的原因。
如建议所述,使用fs.open()似乎有些过度,因为我不想打开文件。
在第一个评论中,从fs.stat开始的部分,我检查使用fs.rename创建的文件是否已经存在。我猜这可能会受到竞态条件的影响,但我找不到任何方式处理fs.rename中的重复项。
由于此应用程序旨在用于“家庭计算”,我认为在stat检查和重命名之间文件消失的情况不太可能发生。但是,仍然可以避免更多潜在的问题,这样做更好。
fs.exists()已经过时,仅出于历史原因而存在。在自己的代码中几乎没有理由使用它。
特别是,在打开文件之前检查文件是否存在是一种反模式,会让您容易受到竞态条件的影响:另一个进程可能会在调用fs.exists()和fs.open()之间删除该文件。只需打开文件,当文件不存在时处理错误即可。
fs.exists()将被弃用。
我目前在移动文件之前使用它,因为fs.rename()似乎会悄悄地覆盖目标文件夹中同名的文件。
我的问题是:我应该使用什么来防止fs.rename()覆盖目标文件夹中的文件? 我认为有一种我不知道的方法。否则,我看不出fs.exists()被弃用的原因。
如建议所述,使用fs.open()似乎有些过度,因为我不想打开文件。
编辑,根据 @jfriend00 的要求提供更多关于我的工作的信息。
我正在制作一个 Electron 应用程序,用户可以将文件分类到不同的目录中。它不是服务器软件,而是旨在运行在日常用户的机器上,处理他们的文档。这是迄今为止移动文件的代码:
function moveFile(destIndex){
var from = queue[currentQueueIndex].path;
var to = destinations[destIndex].path + path.sep + path.basename(from);
console.log("[i] Move file (from/to): ");
console.log(from);
console.log(to);
//Check if file exists, if yes: give them the choice to cancel.
fs.stat(to, function (err, stats) {
if (err){
move(from, to);
} else {
var confirmed = confirm("File already exists, will overwrite.");
if (confirmed) {
move(from, to);
}
}
});
next(); //Show the next file to the user
}
function move(from, to){
fs.rename(from, to, function (err) {
if (err) throw err;
console.log('[i] Move successful');
queue[currentQueueIndex].path = to;
queue[currentQueueIndex].moved = true;
});
}
在第一个评论中,从fs.stat开始的部分,我检查使用fs.rename创建的文件是否已经存在。我猜这可能会受到竞态条件的影响,但我找不到任何方式处理fs.rename中的重复项。
由于此应用程序旨在用于“家庭计算”,我认为在stat检查和重命名之间文件消失的情况不太可能发生。但是,仍然可以避免更多潜在的问题,这样做更好。
fs.exists()
做什么?在我们能够建议一些不容易出现竞态条件的替代方案之前,我们需要更多关于你代码序列的细节。问题在于,任何只检查文件是否存在然后基于此知识执行操作的替代方案都容易出现竞态条件,很可能有更好的编码方式。 - jfriend00fs.rename()
的一个版本,它不会覆盖目标,因此您可以这样调用它,只有当重写失败,因为目标存在时,才提示并将参数更改为fs.rename()
以允许覆盖。这将永远不会在未经提示的情况下进行覆盖。但是,我同意-在这种用例中可能不需要。 - jfriend00