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几种形式的树结构菜单
May 10 Javascript
JavaScript 学习历程和心得分享
Dec 12 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
JavaScript 垃圾回收机制分析
Oct 10 Javascript
js实现数字每三位加逗号的方法
Feb 05 Javascript
JQuery select(下拉框)操作方法汇总
Apr 15 Javascript
jQuery插件制作之全局函数用法实例
Jun 01 Javascript
JS实现文档加载完成后执行代码
Jul 09 Javascript
使用JS获取页面上的所有标签
Oct 18 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 Javascript
webpack的pitching loader详解
Sep 23 Javascript
OpenLayers3加载常用控件使用方法详解
Sep 25 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时间戳使用实例代码
2008/06/07 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
JS location几个方法小姐
2008/07/09 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
Python logging设置和logger解析
2019/08/28 Python
python实现程序重启和系统重启方式
2020/04/16 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
如何利用cmp命令比较文件
2016/04/11 面试题
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
2015年教研组工作总结
2015/05/04 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
会计入职心得体会
2016/01/22 职场文书
无线电知识基础入门篇
2022/02/18 无线电
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis