文件读写
同步方法和异步方法
在Nodejs中,使用fs模块来实现有关文件及目录的创建、写入及删除操作,此中所有操作都可以使用同步和异步两种方式。
- // 同步方法
- var fs = require('fs')
- var data = fs.readFile('./text.txt', 'utf8')
- // 等待操作返回结果
- console.log(data)
- // 异步方法
- var fs = require('fs')
- fs.readFile('./text.txt', (err, data) => {
- // 操作结果作为回调函数参数返回
- console.log(data)
- })
同步与异步的区别在于:同步方法立即返回操作结果,但在使用同步方法执行的操作结束之前,不能执行后续代码。而异步方法将操作结果作为回调函数的参数进行返回,在方法调用之后,可以立即执行后续代码。
文件的读写操作
readFile & writeFile
fs.readFile(filename, [options], callback)
在readFile函数中,接受三个参数:
- filename,用于指定读取文件的完整文件路径及文件名
- options,指定读取文件时需要使用的选项,在该参数值对象中可以使用flag属性指定对该文件采取什么操作,默认为’r’。另外,可以使用encoding属性指定编码格式
- callback,读取文件后的回调函数
fs.writeFile(filename, data, [options], callback)
在writeFile函数中,接受四个参数:
- filename,用于指定读取文件的完整文件路径及文件名
- data,用于指定要写入的内容
- options,指定读取文件时需要使用的选项,在该参数值对象中可以使用flag属性指定对该文件采取什么操作,默认为’r’。另外,可以使用encoding属性指定编码格式
- callback,写入文件后的回调函数
下面是一个简易的例子
- var fs = require('fs')
- var txt = '写入测试数据\r\n成功'
- fs.readFile('./text.txt', 'utf8', (err, data) => {
- if(err) {
- console.log('读取文件失败')
- } else {
- console.log(data)
- }
- })
- fs.writeFile('./text.txt', txt, 'utf8', (err) => {
- if(err) {
- console.log('写入文件失败')
- } else {
- console.log('写入文件成功')
- }
- })
与异步操作对应的有同步操作,readFileSync 和 writeFileSync。
readFile 和 writeFile 这两个方法,是读取文件里的所有数据,那如果我们只是想读取文件的某部分数据,应该怎么做呢?
这就涉及到 read & write 这两个方法了
read & write
read & write 涉及到读取或写入文件的具体数据,两者需要配合 open & close 来使用。
fs.open(filename, flags, [mode], function(err, fd){})
- filename,用于指定读取文件的完整文件路径及文件名
- flags,指定对该文件采取什么操作,默认为’r’
- mode,用于指定对该文件的读写权限,默认值为0666
fs.close(fd, [callback])
- fd,文件描述符
- callback,关闭文件后的回调函数
fs.read(fd, buffer, offset, length, position, function(err, bytesRead, buffer) {})
- fd,文件描述符
- buffer,Buffer对象,用于指定将文件数据读取到哪个缓存区中
- offset,为整数值,用于指定向缓存区中写入数据时的开始写入位置(以字节为单位)
- length,为整数值,用于指定从文件中读取的字节数
- position,为整数值,用于指定读取文件时的开始位置(以字节为单位)
- callback,用于指定文件读取操作执行完毕时执行的函数
- err 读取文件操作失败时触发的错误对象
- bytesRead 实际读取的字节数
- buffer 表示被读取的缓存区对象
fs.write(fd, buffer, offset, length, position, function(err, written, buffer) {})
- fd/buffer/offset/length/position ,参数取值及意义同read函数一致
fs.fsync(fd, [callback])
- fd,文件描述符
如何使用这几个函数,来达到读取/写入部分数据到文件呢?
下面是一个简易例子
- var fs = require('fs')
- // 打开文件
- fs.open('./message.txt', 'r', function(err, fd) {
- // 创建缓存区,用于将文件数据读取到缓存区
- var buf = new Buffer(255)
- // 读取文件
- fs.read(fd, buf, 0, 9, 3, function(err, bytesRead, buffer) {
- console.log(buffer.slice(0, bytesRead).toString())
- // 从文件的当前读取位置继续往下读取
- fs.read(fd, buf, 0, 3, null, function(err, bytesRead, buffer) {
- console.log(buffer.slice(0, bytesRead).toString())
- // 关闭文件
- fs.close(fd)
- })
- })
- })
- // 创建缓存区
- var buf = new Buffer('我喜爱编程')
- // 打开文件
- fs.open('./anotherMessage.txt', 'wx', function(err, fd) {
- // 写文件
- fs.write(fd, buf, 0, 15, 0, function(err, written, buffer) {
- if (err) {
- console.log('写文件操作失败')
- } else {
- console.log('写文件操作成功')
- }
- // 把剩余所有数据写入文件中
- fs.fsync(fd)
- // 关闭文件
- fs.close(fd)
- })
- })