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 相关文章推荐
文字幻灯片
Jun 26 Javascript
通过 Dom 方法提高 innerHTML 性能
Mar 26 Javascript
jquery 双色表格实现代码
Dec 08 Javascript
文本框只能选择数据到文本框禁止手动输入
Nov 22 Javascript
JQuery中extend的用法实例分析
Feb 08 Javascript
如何用angularjs制作一个完整的表格
Jan 21 Javascript
浅谈jQuery操作类数组的工具方法
Dec 23 Javascript
JS使用正则实现去掉字符串左右空格的方法
Dec 27 Javascript
jQuery插件ajaxFileUpload使用详解
Jan 10 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
Feb 08 Javascript
Element Backtop回到顶部的具体使用
Jul 27 Javascript
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
2016/07/18 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
用实例说明python的*args和**kwargs用法
2013/11/01 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
用python与文件进行交互的方法
2018/03/01 Python
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
python3中eval函数用法使用简介
2019/08/02 Python
Python request使用方法及问题总结
2020/04/26 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
学生会竞聘书范文
2014/03/31 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
房产公证委托书范本
2014/09/20 职场文书