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 相关文章推荐
一个原生的用户等级的进度条
Jul 03 Javascript
Javascript调用C#代码
Jan 17 Javascript
在网站上应该用的30个jQuery插件整理
Nov 03 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
Jun 15 Javascript
jQuery+AJAX实现网页无刷新上传
Feb 22 Javascript
jQuery实现点击查看大图并以弹框的形式居中
Aug 08 Javascript
微信小程序 开发指南详解
Sep 27 Javascript
关于vue.js v-bind 的一些理解和思考
Jun 06 Javascript
js实现图片粘贴上传到服务器并展示的实例
Nov 08 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
Nov 25 Javascript
小程序文字跑马灯效果
Dec 28 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
Apr 14 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实现下载限制速度示例分享
2014/02/13 PHP
php正则修正符用法实例详解
2016/12/29 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
nodejs教程之异步I/O
2014/11/21 NodeJs
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
python中文编码问题小结
2014/09/28 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
Python箱型图处理离群点的例子
2019/12/09 Python
python绘制彩虹图
2019/12/16 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
新领导上任欢迎词
2014/01/13 职场文书
建筑个人求职信范文
2014/01/25 职场文书
售房委托书
2014/08/30 职场文书
民间借贷协议书范本
2014/10/01 职场文书
2014年人事部工作总结
2014/12/03 职场文书
毕业生对母校寄语
2015/02/26 职场文书
贫困证明书范文
2015/06/16 职场文书
公司安全管理制度范本
2015/08/05 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
Python四款GUI图形界面库介绍
2022/06/05 Python