【发布时间】:2015-10-26 06:25:05
【问题描述】:
根据documentation node.js fs.exists() 将被弃用。 他们的推理:
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 以任何方式处理重复项。
由于此应用程序旨在用于“家庭计算”,因此我认为文件在统计检查和重命名之间消失的情况不太可能发生。但是,我可以避免的潜在问题越多越好。
【问题讨论】:
-
你到底想用
fs.exists()做什么?我们需要更多关于您的代码序列的详细信息,然后才能提出一些不受竞争条件影响的建议?关键是,任何仅检查存在性然后根据该知识执行操作的替代品都会受到竞争条件的影响,并且可能有更好的编码方式。 -
@jfriend00 - 我已经在主要问题中添加了我正在做的事情以及它的代码。
-
如果最终用户提示在某种程度为单用户的计算机上,所产生的竞争条件可能并不重要。真正的答案是
fs.rename()的一个版本,它不会覆盖目标,所以你可以这样调用它,只有当它因为目标存在而无法进行重写时,你会提示并将参数更改为 @987654326 @ 允许覆盖。如果没有事先提示,这将永远不会覆盖。但是,我同意 - 在这种类型的用例中可能不需要。
标签: node.js