根据文档 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;
});
}
Run Code Online (Sandbox Code Playgroud)
在第一个注释之后,以fs.stat开头的部分,我检查我将要用fs.rename创建的文件是否已经存在.我想这是受竞争条件影响的,但我发现fs.rename无论如何处理重复.
由于此应用程序用于"家庭计算",我不认为文件检查和重命名之间文件消失的情况很可能发生.但是,我可以避免的潜在问题越多越好.
使用fs.existsSync().
fs.existsSync()尚未弃用.
https://nodejs.org/api/fs.html#fs_fs_existssync_path
fs.existsSync(路径)
添加于:v0.1.21路径| fs.exists()的同步版本.如果文件存在则返回true,否则返回false.
请注意,不推荐使用fs.exists(),但不推荐使用fs.existsSync().(fs.exists()的callback>参数接受与其他> Node.js回调不一致的参数.fs.existsSync()不使用回调.)
这是一个使用fs.stat
,但也正确处理错误的示例:
async function fileExists(filename) {
try {
await fs.promises.stat(filename);
return true;
} catch (err) {
if (err.code === 'ENOENT') {
return false;
} else {
throw err;
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7763 次 |
最近记录: |