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 相关文章推荐
高性能web开发 如何加载JS,JS应该放在什么位置?
May 14 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
Oct 15 Javascript
JS如何设置iOS中微信浏览器的title
Nov 22 Javascript
前端自动化开发之Node.js的环境搭建教程
Apr 01 Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
Nov 22 Javascript
详解webpack之scss和postcss-loader的配置
Jan 09 Javascript
Angular 实现输入框中显示文章标签的实例代码
Nov 07 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
Sep 10 Javascript
Vue 实现html中根据类型显示内容
Oct 28 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
Apr 29 Javascript
js实现炫酷光感效果
Sep 05 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
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
jQuery搜索子元素的方法
2015/02/10 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
生产车间主管岗位职责
2013/12/28 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
知识竞赛主持词
2014/03/26 职场文书
党的群众路线教育实践活动学习计划
2014/11/03 职场文书
地方课程教学计划
2015/01/19 职场文书
合同审查法律意见书
2015/06/04 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL