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 相关文章推荐
输入自动提示搜索提示功能的javascript:sugggestion.js
Sep 02 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
Oct 29 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
javascript中闭包(Closure)详解
Jan 06 Javascript
基于JQuery实现图片轮播效果(焦点图)
Feb 02 Javascript
Jquery实现的简单轮播效果【附实例】
Apr 19 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
Dec 14 Javascript
基于JavaScript实现微信抢红包功能
Jul 20 Javascript
Vue项目添加动态浏览器头部title的方法
Jul 11 Javascript
通过layer实现可输入的模态框的例子
Sep 27 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
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
php中JSON的使用与转换
2015/01/14 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
jquery select下拉框操作的一些说明
2010/04/02 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
Python设计模式之单例模式实例
2014/04/26 Python
Python脚本实现集群检测和管理功能
2015/03/06 Python
python之Socket网络编程详解
2016/09/29 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
数据库方面面试题
2012/04/22 面试题
《悯农》教学反思
2014/04/28 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python