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 打地鼠游戏代码说明
Oct 12 Javascript
分享几个超级震憾的图片特效
Jan 08 Javascript
JS 退出系统并跳转到登录界面的实现代码
Jun 29 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
Sep 16 Javascript
完全深入学习Bootstrap表单
Nov 28 Javascript
微信小程序实现tab页面切换功能
Jul 13 Javascript
JavaScript 点击触发复制功能实例详解
Nov 02 Javascript
在Vue项目中引入JQuery-ui插件的讲解
Jan 27 jQuery
一些手写JavaScript常用的函数汇总
Apr 16 Javascript
详解Vue demo实现商品列表的展示
May 07 Javascript
微信小程序与公众号实现数据互通的方法
Jul 25 Javascript
vue实现图片上传功能
May 28 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
图书管理程序(二)
2006/10/09 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
在Python下尝试多线程编程
2015/04/28 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python访问抓取网页常用命令总结
2017/04/11 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python实现简易动态时钟
2018/11/19 Python
python简单贪吃蛇开发
2019/01/28 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2014年创卫工作总结
2014/11/24 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript