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一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
Jan 09 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
May 13 Javascript
AngularJS实现表单手动验证和表单自动验证
Dec 09 Javascript
jQuery的ready方法实现原理分析
Oct 26 Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
JSONP原理及应用实例详解
Sep 13 Javascript
详解关于element级联选择器数据回显问题
Feb 20 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
Feb 28 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 Javascript
JS实现导航栏楼层特效
Jan 01 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
Sep 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
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python多项式回归的实现方法
2019/03/11 Python
详解python中的线程与线程池
2019/05/10 Python
Pycharm调试程序技巧小结
2020/08/08 Python
python excel多行合并的方法
2020/12/09 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
css sprite简单实例
2016/05/23 HTML / CSS
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
满月酒答谢词
2014/01/14 职场文书
高中运动会广播稿
2014/01/21 职场文书
会议通知范文
2015/04/15 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python