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 相关文章推荐
网站被黑的假象--ARP欺骗之页面中加入一段js
May 16 Javascript
一句话JavaScript表单验证代码
Aug 02 Javascript
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
JQuery动画和停止动画实例代码
Mar 01 Javascript
jquery图片放大镜功能的实例代码
Mar 26 Javascript
JavaScript中setAttribute用法介绍
Jul 20 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
Sep 25 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
Aug 23 Javascript
Bootstrap table的使用方法
Nov 02 Javascript
javascript使用递归算法求两个数字组合功能示例
Jan 03 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
js代码实现轮播图
May 04 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 图像处理类1
2009/06/15 PHP
PHP安全性漫谈
2012/06/28 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
PHP常用处理静态操作类
2015/04/03 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
javascript中this的四种用法
2015/05/11 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
Python实现从百度API获取天气的方法
2015/03/11 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
python学生信息管理系统(初级版)
2018/10/17 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
python3实现绘制二维点图
2019/12/04 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
水利公司纪检监察自我鉴定
2014/02/25 职场文书
关于诚信的活动方案
2014/08/18 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
会议接待欢迎标语
2014/10/08 职场文书
婚礼父母答谢词
2015/01/04 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
一条 SQL 语句执行过程
2022/03/17 MySQL