var fs = require('fs')

fs.open('./a.txt', 'a+', function(err, fd) {
// 打开文件后 创建缓冲区放置数据
var readBuf = Buffer.alloc(), // 读取多少字节
bufOffset = ,
readbufLength = readBuf.length,
filePosition = ; // 提供缓冲区的第50个字节开始
// 读取文件
fs.read(fd, readBuf, bufOffset, readbufLength, filePosition, function(err, readBytes,buffer) {
console.log('err: '+err)
console.log('readBytes: '+readBytes) // 读入缓冲区的字节数
console.log('buffer: '+buffer) // 读入缓冲区的内容
}) // 写入文件
var writeBuf = Buffer.from("我是要写入的内容;"),
bufPosition = , // 待写入数据在缓冲区的起始位置
writbufLength = writeBuf.length, // 待写入数据的长度
filePosition = null; // 从文件中的什么位置开始写入数据
fs.write(fd,writeBuf,bufPosition,writbufLength,filePosition,function(err,bytesWritten,buffer){
console.log(err);
console.log(bytesWritten);
console.log(buffer.toString());
}) // 关闭文件
fs.close(fd,function(){
console.log("操作完毕,关闭文件")
})
})

下面对于上面代码进行分解:

一. 在读取或者处理文件之前,必须先使用fs.open()函数打开文件,然后使用文件描述符调用所提供的回调函数,稍后就可以用这个回调函数对打开的文件进行读写.

var fs = require('fs')

fs.open('./a.txt', 'a+', function(err, fd) {
// 获取文件描述符
})

fs.open(path, flags, callback)函数的参数:

  1. path: 文件路径

  2. flags: 标志位, 表明文件以何种模式打开, 标志位有: r 、 r+、 w、 w+、 a、 a+

  • r     -->  读取模式, 数据流的位置在文件的起始处;(必须保证文件存在)
  • r+   -->  读写模式,数据流的位置在文件的起始处;(必须保证文件存在)
  • w    -->  写入模式,  如果文件存在清零, 文件不存在, 会创建文件写入数据, 数据流的位置在文件的起始处;  
  • w+  -->  读写模式,  如果文件存在清零, 文件不存在, 会创建文件写入数据, 数据流的位置在文件的起始处;
  • a     --> 追加写入模式,   文件不存在会创建新的文件, 数据流的位置在文件的结尾处,此后的写操作都将数据追加到文件后面
  • a+   --> 读取和追加写入模式,   文件不存在会创建新的文件, 数据流的位置在文件的结尾处,此后的写操作都将数据追加到文件后面

  3. callback回调函数, 有两个参数, err, fd.  返回文件描述符

二. 文件一旦打开,对其进行读取操作, 在读取之前, 必须创建一个缓冲区来放置数据. 缓冲区被传递到充满文件数据的fs.read函数

var fs = require('fs')

fs.open('./a.txt', 'r', function(err, fd) {
// 打开文件后 创建缓冲区放置数据
var readBuf = Buffer.alloc(), // 读取多少字节
bufOffset = ,
readbufLength = readBuf.length,
filePosition = ; // 提供缓冲区的第50个字节开始
// 读取文件
fs.read(fd, readBuf, bufOffset, readbufLength, filePosition, function(err, readBytes,buffer) {
console.log('err: '+err)
console.log('readBytes: '+readBytes) // 读入缓冲区的字节数
console.log('buffer: '+buffer) // 读入缓冲区的内容
})
})

fs.open()成功打开文件后, 调用回调函数, 创建缓冲区(以上代码), 要求以所提供的缓冲区的第50个字节开始, 读取随后的1024个字节的数据.

fs.read()的回调函数,当下列三种情况之一发生时就会调用该回调函数:

  • 有错误发啥
  • 成功读取了数据
  • 没有数据可读

 当发生错误时, 回调函数通过第一个参数获取一个错误对象,否则该参数为null

 如果成功读取了数据,第二个参数(readBytes)获得读入缓冲区的字节数, 如果其值为0, 代表到达文件尾部

三. 写入文件, 通过向fs.write()函数传递一个包含数据的缓冲区, 可以向一个已打开的文件写入数据

var fs = require('fs')

fs.open('./a.txt', 'a', function(err, fd) {
var writeBuf = Buffer.from("我是要写入的内容;"),
bufPosition = ,           // 待写入数据在缓冲区的起始位置
writbufLength = writeBuf.length,  // 待写入数据的长度
filePosition = null;         // 从文件中的什么位置开始写入数据
fs.write(fd,writeBuf,bufPosition,writbufLength,filePosition,function(err,bytesWritten,buffer){
console.log(err);
console.log(bytesWritten);
console.log(buffer.toString());
})
})

以上代码以追加模式打开文件, 向文件写入数据, 传递的缓冲区包括:

  • 准备写入缓冲区的数据
  • 待写入数据在缓冲区中的起始位置
  • 待写入数据的长度
  • 从文件中的什么位置开始写入数据
  • 写入操作结束后被调用的回调函数

列举中, 向文件中写入数据的起始位置是null, 表明写入操作将从当前文件的游标处开始. 由于是以追加模式打开文件的, 因此此时的文件游标位于文件的结尾处.

四. 关闭文件

var fs = require('fs')

fs.open('./a.txt', 'a+', function(err, fd) {
// 关闭文件
fs.close(fd,function(){
console.log("操作完毕,关闭文件")
})
})

  当node进程退出后,操作系统会确保所有文件都被关闭

 在实际应用程序中, 一旦打开一个文件,最后必须关闭它.

  

node中fs模块 - fs.open() fs.read() fs.write() fs.close()的更多相关文章

  1. Node中的模块系统

    加载require var 自定义变量名称 = require('模块') 两个作用: 执行被加载模块的代码 得到被加载模块中的exports导出接口对象 导出exports node中是模块作用域, ...

  2. node 中第三方模块的加载过程原理

    node 中第三方模块的加载过程原理 凡是第三方模块都必须通过 npm 来下载 使用的时候就可以通过require('包名') 的方式来进行加载才可以使用 不可能有任何一个第三方包和核心模块的名字是一 ...

  3. node中的模块

    模块 编写稍大一点的程序时一般都会将代码模块化.在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名. 在编写每个模块时,都有require.expor ...

  4. Node中的模块引入机制

    1.如果模块在当前目录下,可以通过下面语句将模块引入进来,注意需要使用 "./"表示当前路径 const currency = require('./currency'); ←-- ...

  5. Node中导入模块require和import??

    转自:https://blog.csdn.net/wxl1555/article/details/80852326 S6标准发布后,module成为标准,标准的使用是以export指令导出接口,以im ...

  6. node中glob模块

    glob glob允许使用规则,从而获取对应规则匹配的文件 node的glob模块允许你使用 * 等符号,来写一个glob规则,像在shell里一样,获取匹配对应规则文件 安装 npm install ...

  7. 使用node中mysql模块连接本地数据库

    连接数据库的方法迄今为止学了三种: cmd方式.可视化工具,今天记第三种----node端连接数据库. 一:mysql模块介绍与下载 1.mysql模块是node端专门连接数据库的第三方模块 2.下载 ...

  8. node中glob模块总结

    参考文章:   githup_glob    node-glob学习 前言: 最近在学习webpack配置, 其中有一项glob配置入口文件, 来获取对应的文件名, 达到入口entry和output文 ...

  9. Node.js 文件系统fs模块

    Node.js 文件系统封装在 fs 模块是中,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX 文件系统操作. 与其他模块不同的是,fs 模块中所有的操作都提供了异步的和 同步的两个 ...

  10. nodejs入门API之fs模块

    fs模块下的类与FS常量 fs模块下的主要方法 fs的Promise API与FileHandle类 一.fs模块下的类 1.1 fs.Dir:表示目录流的类,由 fs.opendir().fs.op ...

随机推荐

  1. linux中find,locate,whereis,which关系和用法

    主要有find,locate,whereis,which等 1. find是最常用也是最强大的查找命令,它可以查找任何类型的文件. find命令的一般格式为:find <指定目录>< ...

  2. python关于文件操作

    今日所得 文件操作模式的补充 文件光标的移动控制 截断文件 修改文件 函数的简单介绍 文件操作模式的补充 """ r w a 将上面的三个模式称为纯净模式 r+ w+ a ...

  3. 吴裕雄--天生自然python学习笔记:python文档操作自动查找替换 Word 文件中的指定文字

    Win32com 组件提供了自动替换 Word 文件中指定文字 的功能 .在使用“查找” 功能替换文字之前,可先清除源文字及目标文字的格式,以免影响替换效果,语法为 : 替换 Word 文件特定文字的 ...

  4. Qt error C2338: No Q_OBJECT in the class with the signal错误解决办法(无法编译过信号与槽)

    由于没有继承QObject类而引起的 只需继承QObject类即可 如果已经继承了QObject类,编译还出现错误 将QObject类放在最前面继承:public QObject 最后即可编译通过

  5. iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

    iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件 iOS高仿微信完整项目源码 想要更简单的推送消息,看本文就对了 ScrollView嵌套ScrolloView解决方 ...

  6. OpenCV 霍夫线变换

    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...

  7. js - 常用的继承

    零.序言 参考资料:JavaScript常用八种继承方案: 注:1.此篇笔记是站在上述资料的肩膀上的一篇小结: 2.阅读之前建议温习一下 js 中的 prototype 和 constructor:( ...

  8. python3多线程爬虫(第一卷)

    多进程虽然使用方便,可以充分利用CPU,但是由于个进程之间是并行且各自有自己的数据存储,所以很难进行数据间的通信,需要接入第三方模块,现在我依旧用糗事百科讲解下多线程的应用,举个例子之前用4个进程同时 ...

  9. Dubbo的集群容错与负载均衡策略

    Dubbo的集群容错策略 正常情况下,当我们进行系统设计时候,不仅要考虑正常逻辑下代码该如何走,还要考虑异常情况下代码逻辑应该怎么走.当服务消费方调用服务提供方的服务出现错误时候,Dubbo提供了多种 ...

  10. [转]cookie 和 session

    原文:https://github.com/alsotang/node-lessons/tree/master/lesson16 读别人源码教程的时候,看到了这个,觉得写的很透彻,转. 众所周知,HT ...