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. C# 元组

    Tuple<,); Console.WriteLine(t.Item1); Console.WriteLine(t.Item2); C#7 可以使用圆括号声明一个元组: (); Console. ...

  2. vue2.0学习之组件间通信

    /* child.vue*/ 子组件 <template> <div> /*必须要用div包裹起来,然后在里面写需要的组件内容,这里面和平常写的html是一样的*/ <d ...

  3. Windows2012R2 设置NTP时间服务器

    一.服务端配置 (Ntp服务器,客户端将根据这台服务器的时间进行同步) 1.微软键+R键,进入“运行”,输入“regedit”,进入注册表 2. HKEY_LOCAL_MACHINE\SYSTEM\C ...

  4. 84)PHP,SQL注入基础讲解

     怎么预防: 填写防止SQL注入的代码:

  5. python-django-fastdfs+Nginx的安装和配置_20191122

    python-django-fastdfs+Nginx的安装和配置 FastDFS文件系统 FastDFS文件系统简介: 是c语言编写的,是淘宝的架构师写的,存储淘宝的图片,后来开源了, fastDF ...

  6. HDU1166 敌兵布阵 [线段树模板]

    题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...

  7. Telnet和SSH区别

    首先,telnet和ssh都是连接远程计算机的连接协议,可以完成对完成计算机的控制,方便维护.其次,他们都是基于TCP/IP协议下的,所以连接时都需要知道目标机的网址或者域名,第三,他们都是与远程主机 ...

  8. Django常见错误总结

    1 ImportError: No module named 'MySQLdb' 解决方法: . 安装pymysql模块 . 在app的__init__.py文件中写入以下内容 import pymy ...

  9. [LC] 226. Invert Binary Tree

    Invert a binary tree. Example: Input: 4 / \ 2 7 / \ / \ 1 3 6 9 Output: 4 / \ 7 2 / \ / \ 9 6 3 1 /* ...

  10. timber|stain|compensate|

    N-UNCOUNT 木材;原木;树木:林木Timber is wood that is used for building houses and making furniture. You can a ...