什么是 fs(文件系统)
- file system
- 在 Node 中,与文件的交互是十分重要的,服务器的实质就是将本地的文件发送给近程的客户端
- Node 通过 fs 模块来和文件系统进行交互
- 该模块提供了一些标准文件拜访 API 来关上,读取,写入文件,以及其余的交互
- Node 中应用 fs 模块,
const fs = require('fs')
fs 中的同步和异步
- fs 模块中的所有操作都有两种操作模式,即同步和异步
- 同步文件系统会阻塞零碎的执行,也就是除非操作实现,否则代码不会往下继续执行了
- 异步文件系统不会阻塞程序的执行,而是在操作实现是,通过回调函数将后果返回
fs 的应用
文件写入
-
手动操作的步骤
-
关上文件
-
同步:
fs.openSync(path[, flags[, mode]])
- path:要关上的文件的门路
-
flags:关上文件要做的操作类型(上面会具体介绍有多一些操作类型)
- r:只读的
- w:可写的
- a: 追加
- mode:可选值,是设置文件的操作权限,个别不传
- 该办法会返回一个文件的描述符作为后果,咱们能够通过该描述符来对文件进行各种操作
-
异步:
fs.open(path[, flags[, mode]], callback)
-
callback:两个返回参数
- err:谬误对象,如果没有就是 null
- fa:文件的描述符
-
-
-
向文件中写入内容
-
同步:
fs.writeSync(fd, string[, position[, encoding]])
- fd:文件的描述符,须要传递要写入的描述符
- string:要写入的内容
- position:个别不写,示意写入的起始地位
- encoding:个别不写,示意编码,默认 utf-8
- 异步:
fs.write(fd, string[, position[, encoding]], callback)
-
-
保留并敞开文件
-
fs.closeSync(fd)
- fd:要敞开文件的描述符
fs.close(fd[, callback])
-
// 同步写入文件 const fs = require('fs') // 关上文件 let fd = fs.openSync('demo.txt','w') // 写入文件 fs.writeSync(fd, "仙剑奇侠传三") // 敞开文件 fs.closeSync(fd)
// 异步写入文件 const fs = require('fs') // 关上文件 fs.open('demo2.txt','w',function(err,fd) {if(!err) { // 写入文件 fs.write(fd,'恋情公寓',function(err) {if(!err) {console.log('写入胜利') } // 敞开文件 fs.close(fd,function(err) {if(!err) {console.log('已保留并敞开文件') } }) }) }else{console.log('出错了') } })
-
-
简略文件写入
- 同步:
fs.writeFileSync(file, data[, options])
-
异步:
fs.writev(fd, buffers[, position], callback)
- file:要操作的文件的门路
- data:要写入的数据
-
options:可选,能够对写入进行一些设置,是一个对象,有三个值
- encoding:编码。默认 ‘utf8’
- mode:文件权限。默认 0o666
- flag:文件只读还是可写。默认 ‘w’(上面会具体介绍有多一些操作类型)
-
callback:当写入实现当前,执行
// 简略文件写入 const fs = require('fs') // 异步 fs.writeFile('demo3.txt','景天和雪见',function(err) {if(!err){console.log('写入胜利') } }) // 同步 fs.writeFileSync('demo4.txt','紫萱和徐长卿')
- 同步:
-
流式文件写入
- 同步,异步,简略文件写入都不适宜大文件写入,所以有了流式文件写入
-
用法:创立一个可写流,
fs.createWriteStream(path[, options])
// 流式文件写入 const fs = require('fs') // 创立一个可写流 let ws = fs.createWriteStream('demo.txt') // 通过 ws 想文件中输入内容 ws.write("通过可写流写入的内容") // 敞开流, 不能用 ws.close(), 不然文件传不完 ws.end()
-
flag: 文件操作类型有哪些
- r:读取文件,文件不存在则出现异常
- r+:读写文件,文件不存在则出现异常
- rs:在同步模式下关上文件用于读取
- rs+:在同步模式下关上文件用于读写
- w:关上文件用于写操作,如果不存在则创立,如果存在则截断,截断即笼罩全副
- wx:关上文件用于写操作,如果存在则关上失败
- w+: 关上文件用于读写,如果不存在则创立,如果存在则截断
- wx+:关上文件用于读写,如果存在则关上失败
- a:关上文件用于追加,如果不存在则创立
- ax:关上文件用于追加,如果门路存在则失败
- a+:关上文件进行读取和最佳,如果不存在则创立
- ax+:关上文件进行读取和追加,如果门路存在则失败
文件读取
-
简略文件读取
- 同步:
fs.readFileSync(path[, options])
-
异步:
fs.readFile(path[, options], callback)
-
callback(err,data)
- err:谬误对象
-
data:读取到的数据,是一个 Buffer,为什么是 Buffer 呢?因为读取到的不肯定是字符串,可能是图片,音频等。Buffer 的通用性更高。字符串的话能够用 toString 读取数据
// 简略文件读取 const fs = require('fs') fs.readFile('demo.txt',function(err,data) {if(!err) {console.log(data) console.log(data.toString()) } })
-
- 同步:
-
流式文件读取
- 同样实用于大文件
-
用法:
fs.createReadStream(path[, options])
// 流式读取文件 const fs = require('fs') // 创立一个可读流 let rs = fs.createReadStream('demo.txt') // 读取可读流中的数据,必须要可读流绑定一个 data 事件,data 事件绑定结束,他会主动读取数据 rs.on('data',function(data) {console.log(data) console.log(data.toString()) }) // 如果咱们想把读取到数据写到另一个文件当中 let ws = fs.createWriteStream('demo1.txt') // 应用 pipe(管道),会间接输出到 ws 中 rs.pipe(ws)