详谈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 相关文章推荐
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
Js判断CSS文件加载完毕的具体实现
Jan 17 Javascript
jQuery的选择器中的通配符使用介绍
Mar 20 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 Javascript
json格式的javascript对象用法分析
Jul 04 Javascript
fullpage.js全屏滚动插件使用实例
Sep 06 Javascript
JavaScript自定义文本框光标
Mar 05 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
Aug 29 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
May 03 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
vue实现单一筛选、删除筛选条件
Oct 26 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
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
js转换对象为xml
2017/02/17 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
Python中splitlines()方法的使用简介
2015/05/20 Python
python得到windows自启动列表的方法
2018/10/14 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
雷人标语集锦
2014/06/19 职场文书
物业保安岗位职责
2014/07/02 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
go语言中http超时引发的事故解决
2021/06/02 Golang
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python