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. SpringBoot:Shiro 整合 Redis

    前言 前段时间做了一个图床的小项目,安全框架使用的是Shiro.为了使用户7x24小时访问,决定把项目由单机升级为集群部署架构.但是安全框架shiro只有单机存储的SessionDao,尽管Shrio ...

  2. mongodb 前人埋坑的奇怪问题

    接手一个很老的项目 数据库用的mongodb 代码里的collections表名用的auth没问题 直接去monogdb show table 确实有auth表 想在本地登录,看看用户信息 > ...

  3. 3dmax2018卸载/安装失败/如何彻底卸载清除干净3dmax2018注册表和文件的方法

    3dmax2018提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dmax2018失败提示3dmax2018安装未完成,某些产品无法安装,也有时候想重新安装3 ...

  4. WPF中,如何屏蔽WebBrowser弹出的脚本错误窗口?

    WPF没有自带屏蔽这些窗口的方法或属性,可以使用反射的方法来屏蔽弹出脚本错误窗口: public void SuppressScriptErrors(WebBrowser wb, bool Hide) ...

  5. 年轻的心与渐行渐近的梦——记微软-斯坦福产品设计创新课程ME310

    作者:中国科学技术大学 王牧 Stanford  D. School 2014年6月,沐浴着加州的阳光,在斯坦福大学(下文简称Stanford)完成汇报后,历时一年的创新设计课程ME310的项目结束 ...

  6. 瑞星发布Linux系统安全报告:Linux病毒或将大面积爆发

    近半年来,由于中央推荐使用国产Linux操作系统,国产Linux操作系统开始受到政府机关及大型企事业机关单位的高度重视.很多人都认为,以Linux系统为基础的国产操作系统最符合国家.政府和企业信息安全 ...

  7. Nginx笔记总结十:Nginx日志切割

    1.Nginx日志切割 logrotate日志文件管理工具,通过cron程序定期执行,默认在cron默认程序的dayli目录下 [root@joker logrotate.d]# cat /etc/c ...

  8. js 实现排序算法 -- 快速排序(Quick Sort)

    原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...

  9. unicode编码与解码

    unicode编码与解码,代码如下 package com.fenqiguanjia.api.services; /** * Created by daixianjun on 2017/9/3. */ ...

  10. 上传第三方jar包到nexus

    1.创建一个新的repository存放第三方jar包(3rd_party) 2.执行以下命令进行上传:切记需要上传的本地jar包路径不能在本地仓库下,可以随便放一个位置.(以下标红的,请根据自己情况 ...