node.js fs.exists()将被弃用,而是使用什么?

根据文档 node.js fs.exists()将被弃用。 他们的推理:

fs.exists()是一个时代错误,只存在于历史原因。 几乎从来没有理由在你自己的代码中使用它。

特别是,在打开文件之前检查文件是否存在是一种反模式,使您容易受到竞争状况的影响:另一个进程可能会在调用fs.exists()和fs.open()之间删除文件。 只要打开文件,并处理不存在的错误。

fs.exists()将被弃用。

我目前正在使用它移动文件之前,因为fs.rename()似乎悄悄地覆盖目标文件夹中具有相同名称的文件。

我的问题是 我应该用什么来防止fs.rename()覆盖目标文件夹中的文件? 我假设有一种我不知道的方式。 否则,我不认为fs.exists()的原因是不赞成的。

因为我不想打开这个文件,所以使用fs.open()会导致错误。


编辑 ,根据@ jfriend00的请求更多的信息关于我在做什么。

我正在制作一个电子应用程序,用户可以将文件分类到不同的目录中。 这不是一个服务器软件,它的目的是在每天的用户机器上运行,处理他们的文档。 这是移动文件的代码:

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创build的文件是否已经存在。 我想这是受到竞争条件,但我不能findfs.rename以任何方式处理重复。
由于此应用程序旨在“家庭计算”,我不认为文件消失之间的统计检查和重命名可能发生的场景。 但是,我可以避免的潜在问题越多越好。

io.js文档提到使用fs.stat()fs.access()来代替fs.exists()

使用fs.existsSync()。

fs.existsSync()尚未被弃用。

https://nodejs.org/api/fs.html#fs_fs_existssync_path

fs.existsSync(path)

添加在:v0.1.21path| fs.exists()的同步版本。 如果文件存在则返回true,否则返回false。

请注意, fs.exists()已弃用,但fs.existsSync()不适用 。 (fs.exists()的callback>参数接受与其他> Node.jscallback不一致的参数。fs.existsSync()不使用callback。

这里是使用fs.stat例子: –

 fs.stat('mycustomfile.csv', function (err, stats) { console.log(stats);//here we got all information of file in stats variable if (err) { return console.error(err); } fs.unlink('mycustomfile.csv',function(err){ if(err) return console.log(err); console.log('file deleted successfully'); }); });