详谈Node.js之操作文件系统


Posted in Javascript onAugust 29, 2017

1. 同步方法与异步方法

在Node.js中,使用fs模块来实现所有有关文件及目录的创建、写入及删除操作。,在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法。这两者区别是:同步方法立即返回操作结果,在使用同步方法执行的操作结束之前,不能执行后续代码,代码类似如下:

Var fs = require('fs')
var data = fs.readFileSysnc('./index.html','utf8')
//等待操作返回结果,然后利用该结果
console.log(data)

而异步方法将操作结果作为回调函数的参数进行返回,在方法调用之后,可以立即执行后续代码,代码如下:

var fs = require('fs')
fs.readFile('./index.html','utf8'.function(err,data){
  //操作结果作为回调函数的第二个参数返回
  console.log(data)
})

另外,当使用如下所示的方法调用多个异步方法时,并不能确保操作结果的返回顺序

fs.readFile('./file.html',function(err,data){
  //回调函数代码
  })
fs.readFile('./otrher.html',function(err,data){
  //回调函数代码
  })

在上述代码中,我们同时执行两个文件的读取操作,但是并不确保哪个操作结果先辈返回。如果要确保在一个问价读取完毕后再读取两一个文件,我们应使用如下方法:

fs.readFileSync('./file.html',function(err,data){
  //回调函数代码
  })
fs.readFileSync('./otrher.html',function(err,data){
  //回调函数代码
  })

2. 对文件执行读写操作

2.1 文件的完整读写

可以使用readFile方法或者readFileSync方法完整读取一个文件:

fs.readFile(filename,[options],callback)
//第一个参数:必选指定读取文件的完整文件路径及文件名
第二个参数:指定读取文件时需要使用的选项,在该参数值对象中可以使用flag属性指定对该文件采取什么操作,默认为‘r'
option:
  flag'r':读取文件,如果文件不存在则抛出异常
    'r+':读取并写入文件,如果文件不存在则抛出异常
    'rs':以同步方式读取文件并通知操作系统忽略本地文件系统缓存,如果文件不存在则抛出异常。因为本属性值忽略本地缓存,适用于操作网络文件系统,但由于其对性能产生一定的负面影响,不建议在其他环境下使用
    'w':写入文件,如果文件不存在则创建文件,如果文件存在则清空文件内容
    'wx':作用与'w'类似,但以排他方式写入文件
    'w+':读取并写入文件。如果不存在则创建文件,如果该文件已存在则清空文件内容       
    'wx+':作用与'w+'类似,但是以排他方式写入文件       
    'a':追加写入文件,如果文件不存在则创建文件
    'ax':作用与'a+'类似,但是以排他方式打开文件
  encoding:
    utf8,ascii,base64,
callback(err,data){
  //回调函数代码略
}
//第一个参数为读取文件操作失败时触发的错误对象
第二个参数值为读取到的文件内容

在使用同步方法读取文件时,使用readFileSync方法:

var data = fs.readFileSync(filename,[options])

eg:

var fs = require('fs')
try{
  var data = fs.readFileSync('./text.txt','utf8')
  //在控制台中输出文件内容
  console.log(data) 
}catch(ex){
  console.log('读取文件时发生错误')
}

在完整写入一个文件时,利用fs模块中的writeFile方法或者writeFileSync方法

fs.writeFile(filename,datda,[options],callback)
//第一个参数:用于指定被写入文件的完整文件路径及文件名
第二个参数:用于指定需要写入的内容,参会素可以为一个字符串或一个Buffer对象
第三个参数:指定写入文件时需要的选项
    flag属性:用于指定该文件采用何种操作,默认为'w'
    mode属性:指定当文件被打开时对文件的读写权限,默认为0666(可读写),第一位必须为0,第二位用于规定文件或目录所有者的权限,第三位为文件或目录所属用户组的权限,第四位为其他用户权限
      1:执行权限
      2:写权限
      4:读权限
    encoding属性:指定使用何种编码格式来写入文件,:utf8 ascii base64
    
callback(err){
  //回调函数代码
}

在使用同步方式写入文件时,使用writeFileSync方法:

fs.writeFileSync(filename,data,[options])

在将一个字符串或一个缓存区中的数据追加到一个文件底部时,可使用fs模块中的appendFile或者appendFildSync方法

fs.appendFile(filname,data,[options],callback)
fs.appendFileSync(filename,data[options])

2.2 从指定位置处开始读写文件

首先需要使用fs模块中的open方法或者openSync方法打开文件,

fs.open(filename,flags,[mode],callback)
其中callback参数为:function(err,fd){
            //回调函数代码
          }
//第一个参数为打开文件操作失败时所触发的错误对象,
第二个参数为一个整数值,代表打开文件时返回的文件描述符

使用同步方式打开文件时,使用openSync方法:

var fd = fs.openSync(filename,flag,[mode])

在打开文件之后,可以在回调函数中使用fs模块中的read方法或者readSync方法从文件的指定位置处读取文件,也可以使用fs模块中的write方法或者writeSync方法从文件的指定处开始写入数据

首先介绍read方法:

fs.read(fd,buffer,offset,length,position,callback)
//第一个参数:open方法所所使用的回调函数中返回的文件描述符或openSync方法返回的文件描述符;
第二个参数:英语指定将文件数据读取到哪个缓存区;
第三个参数:整数,用于指定向缓存区中写入数据时的开始位置,以字节为单位
第四个参数:整数,指定从文件中读取的字节数
第五个参数:整数,指定读取文件时开始位置
callback(err,bytesRead,buffer){
  //回调函数代码
}
err:读取文件操作失败时触发的错误对象
bytesRead实际读取的字节数
buffer:被读取的缓存区对象

使用同步方式打开文件时,使用readSync方法:

var byteRead = fs.readSync(fd,buffer,offset,length,position)

在打开文件后,使用fs模块中的write方法或者writeSync方法从一个缓存区中读取数据并且从文件的指定处开始吸入这些数据

fs.write(fd,buffer,offset,length,position,callback)

  其中callback为function(err,written,buffer){
            //回调函数代码
        }
eg:
 1 var fs = require('fs')
 2 var buf = new Buffer('我喜欢编程')
 3 fs.open('./message.txt','w',function(err,fd){
 4     fs.write(fd,buf,3,9,0,function(err,written,buffer){
 5         if(err)console.log("写文件操作失败")
 6         console.log("写文件操作成功")
 7     })
 8 })

在使用同步方式写入文件时,使用writeSync 方法

fs.writeSync(fd,buffer,offset,length,position)

在fs模块中,使用close方法与closeSync方法以关闭文件

fs.close(fd,[callbcak])
fs.closeSync(fd)

调用close方法前,可以利用fsyn方法将缓存区内容全部写入文件,防止出现遗漏数据

fs.fsyn(fd,[callback])

以上这篇详谈Node.js之操作文件系统就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 日期对象Date扩展方法
May 30 Javascript
javascript 写类方式之三
Jul 05 Javascript
js parentElement和offsetParent之间的区别
Mar 23 Javascript
javascript操作JSON的要领总结
Dec 09 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
Jul 16 Javascript
jQuery实现渐变下拉菜单的简单方法
Mar 11 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
使用axios实现上传图片进度条功能
Dec 21 Javascript
React BootStrap用户体验框架快速上手
Mar 06 Javascript
详解如何在微信小程序中愉快地使用sass
Jul 30 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
Aug 20 Javascript
js链表操作(实例讲解)
Aug 29 #Javascript
在页面中引入js的两种方法(推荐)
Aug 29 #Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
Aug 29 #Javascript
使用canvas进行图像编辑的实例
Aug 29 #Javascript
jQuery实现锚点向下平滑滚动特效示例
Aug 29 #jQuery
js使用html2canvas实现屏幕截取的示例代码
Aug 28 #Javascript
JavaScript编写棋盘覆盖代码详解
Aug 28 #Javascript
You might like
PHP 的 __FILE__ 常量
2007/01/15 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
很酷的javascript loading效果代码
2008/06/18 Javascript
慎用 somefunction.prototype 分析
2009/06/02 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
市场部专员岗位职责
2013/11/30 职场文书
导购员的岗位职责
2014/02/08 职场文书
校运会通讯稿
2015/07/18 职场文书
运动会通讯稿300字
2015/07/20 职场文书
六五普法心得体会2016
2016/01/21 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android