Node.js 中判断一个文件是否存在


Posted in Javascript onAugust 24, 2020

记录一些 Node.js 应用中的小知识点,如果你 Google/Baidu “Node.js 如何判断文件是否存在” 发现给出的很多答案还是使用的 fs.exists,这里不推荐使用 fs.exists 你可以选择 fs.stat 或 fs.access。

为什么不推荐 fs.exists

我们在设计一个回调函数时,通常会遵循一个原则 “ 错误优先的回调函数”,也就是返回值的第一个参数为错误信息,用以验证是否出错,其它的参数则用于返回数据。

如下所示为 fs.exists 的使用示例,直接返回了一个布尔值,违背了 “错误优先的回调函数” 这一设计原则,这是一方面原因。

fs.exists('/etc/passwd', (exists) => { 
 console.log(exists ? '存在' : '不存在'); 
});

另外一个是 不推荐在 fs.open()、 fs.readFile() 或 fs.writeFile() 之前使用 fs.exists() 判断文件是否存在,因为这样会引起 竞态条件,如果是在多进程下,程序的执行不完全是线性的,当程序的一个进程在执行 fs.exists 和 fs.writeFile() 时,其它进程是有可能在这之间更改文件的状态,这样就会造成一些非预期的结果。

不推荐:

(async () => { 
 const exists = await util.promisify(fs.exists)('text.txt'); 
 console.log(exists); 
 await sleep(10000); 
 if (exists) { 
  try { 
   const res = await util.promisify(fs.readFile)('text.txt', { encoding: 'utf-8' }); 
   console.log(res); 
  } catch (err) { 
   console.error(err.code, err.message); 
   throw err; 
  } 
 } 
})();

推荐:

(async () => { 
 try { 
  const data = await util.promisify(fs.readFile)('text.txt', { encoding: 'utf-8' }); 
  console.log(data); 
 } catch (err) { 
  if (err.code === 'ENOENT') { 
   console.error('File does not exists'); 
  } else { 
   throw err; 
  } 
 } 
})();

目前 fs.exists 已被废弃,另外需要清楚, 只有在文件不直接使用时才去检查文件是否存在,下面推荐几个检查文件是否存在的方法。

使用 fs.stat

fs.stat返回一个 fs.Stats 对象,该对象提供了关于文件的很多信息,例如文件大小、创建时间等。其中有两个方法 stats.isDirectory()、stats.isFile() 用来判断是否是一个目录、是否是一个文件。

const stats = await util.promisify(fs.stat)('text1.txt'); 
console.log(stats.isDirectory()); // false 
console.log(stats.isFile()); // true

若只是检查文件是否存在,推荐使用下面的 fs.access。

使用 fs.access

fs.access 接收一个 mode 参数可以判断一个文件是否存在、是否可读、是否可写,返回值为一个 err 参数。

const file = 'text.txt'; 
 
// 检查文件是否存在于当前目录中。 
fs.access(file, fs.constants.F_OK, (err) => { 
 console.log(`${file} ${err ? '不存在' : '存在'}`); 
}); 
 
// 检查文件是否可读。 
fs.access(file, fs.constants.R_OK, (err) => { 
 console.log(`${file} ${err ? '不可读' : '可读'}`); 
}); 
 
// 检查文件是否可写。 
fs.access(file, fs.constants.W_OK, (err) => { 
 console.log(`${file} ${err ? '不可写' : '可写'}`); 
}); 
 
// 检查文件是否存在于当前目录中、以及是否可写。 
fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => { 
 if (err) { 
  console.error( 
   `${file} ${err.code === 'ENOENT' ? '不存在' : '只可读'}`); 
 } else { 
  console.log(`${file} 存在,且可写`); 
 } 
});

同样的也不推荐在 fs.open()、 fs.readFile() 或 fs.writeFile() 之前使用 fs.exists() 判断文件是否存在,会引起竞态条件。

Reference

http://nodejs.cn/api/fs.html

以上就是Node.js 中判断一个文件是否存在的详细内容,更多关于Node.js 判断文件是否存在的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jQuery ui 1.7更新小结
Aug 15 Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
Oct 17 Javascript
基于jquery的多功能软键盘插件
Jul 25 Javascript
jquery.idTabs 选项卡使用示例代码
Sep 03 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
Jan 09 Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 Javascript
node.js读取Excel数据(下载图片)的方法示例
Aug 02 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
详解Angular6学习笔记之主从组件
Sep 05 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
Dec 26 Javascript
在Vue项目中使用snapshot测试的具体使用
Apr 16 Javascript
Vue实现拖放排序功能的实例代码
Jul 08 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 #Javascript
在Vue中使用HOC模式的实现
Aug 23 #Javascript
详解Howler.js Web音频播放终极解决方案
Aug 23 #Javascript
利用React高阶组件实现一个面包屑导航的示例
Aug 23 #Javascript
vue中watch和computed的区别与使用方法
Aug 23 #Javascript
vue动态设置页面title的方法实例
Aug 23 #Javascript
Vue管理系统前端之组件拆分封装详解
Aug 23 #Javascript
You might like
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
javascript 函数的暂停和恢复实例详解
2020/04/25 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
详解python中init方法和随机数方法
2019/03/13 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
土木工程专业个人求职信
2013/12/30 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
三问三解心得体会
2014/09/05 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
2016教师节问候语
2015/11/10 职场文书
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby
JavaScript中reduce()的用法
2022/05/11 Javascript