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 空位补零实现代码
Feb 26 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
May 09 Javascript
jQuery简单实现网页选项卡特效
Nov 24 Javascript
javascript实现仿腾讯游戏选择
May 14 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
使用ionic切换页面卡顿的解决方法
Dec 16 Javascript
简单谈谈axios中的get,post方法
Jun 25 Javascript
Vue-resource拦截器判断token失效跳转的实例
Oct 27 Javascript
微信小程序实现鼠标拖动效果示例
Dec 01 Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
Jun 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
swfupload 多文件上传实现代码
2008/08/27 PHP
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
一步一步学习PHP(3) php 函数
2010/02/15 PHP
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
php利用header函数下载各种文件
2016/08/24 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
python tqdm库的使用
2020/11/30 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
土木工程专业大学毕业生求职信
2013/10/13 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
文明倡议书
2015/01/19 职场文书
暑期实践个人总结
2015/03/06 职场文书
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js