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 Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
Apr 19 Javascript
给事件响应函数传参数的四种方式小结
Dec 05 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
Mar 22 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
Oct 30 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 Javascript
jquery实现网站列表切换效果的2种方法
Aug 12 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
jQuery实现的背景颜色渐变动画效果示例
Mar 24 jQuery
Angularjs自定义指令实现分页插件(DEMO)
Sep 16 Javascript
JavaScript代码实现txt文件的上传预览功能
Mar 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
php限制文件下载速度的代码
2015/10/20 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
validator验证控件使用代码
2010/11/23 Javascript
brook javascript框架介绍
2011/10/10 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
jQuery中is()方法用法实例
2015/01/06 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
Django中的Model操作表的实现
2018/07/24 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
Python实现括号匹配方法详解
2020/02/10 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
数据库的约束含义
2012/09/09 面试题
信息管理员岗位职责
2013/12/01 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
股东合作协议书范本
2014/04/14 职场文书
法制宣传口号
2014/06/16 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers