fs是内置的核心模块,提供文件系统操作的API
fs模块结构
- FS基本操作类
- FS常用API
既然讲到了文件系统,就先介绍一下关于系统和文件的相关知识
- 权限位:在当前操作系统内,不同的用户角色对当前文件能够执行的不同操作
- 文件权限分为三种:
- r:读权限,数字表示4
- w:写权限,数字表示2
- x:执行权限,数字表示1
- 操作系统将用户分为了3类
- 文件所有者,一般都是当前用户
- 文件所属组:当前用户的家人
- 其他用户:如访客
关于文件权限问题如777代表的意义等,可以参考另一篇博客
-
Nodejs中flag表示对文件的操作方式,常见标识符
- r:可读
- w:可写
- s:同步
- +:表示相反的操作
- X:排他操作
- a:表示追加操作
-
fd就是操作系统分配给被打开文件的标识,每打开一个文件就会分配一个标识符,一般从3开始
文件操作API
readFile:异步从指定文件中读取数据
- 作用:读取指定文件的数据
- 语法
fs.readFile(path,options,callback)
- 参数
- path:文件路径,一般我们会选择相对路径
- options:object||string,
- encoding:string||null,文件编码,默认为null
- flag:string,默认值为r
- callback,回调函数,当读取完成后执行的回调函数
- err,错误信息
- data,文件内容,string||buffer
- 实例
const fs = require('fs') const path = require('path') fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{ console.log(err)// 如果没有错误err则是null if(!err){ console.log(data) //欢迎你 } }) fs.readFile(path.resolve('data.txt'),(err,data)=>{ console.log(err)// 如果没有错误err则是null if(!err){ console.log(data) //<Buffer e6 ac a2 e8 bf 8e e4 bd a0> } }) console.log('11111') <!--会先输出111,之后才是异步的文件读取信息-->
- 注意事项
- nodejs是错误优先,所以回调中第一个参数中存储的是错误信息
- 如果没有指定编码,则返回原始的buffer
- 如果options为字符串,我们默认它指定的是编码
- 当我们指定的是目录而非文件的时候,win、mac、linux会返回错误
readFileSync:同步从指定文件中读取数据
- 作用:以同步的方式读取指定文件的数据,会等待文件的读取完成再向下执行
- 语法
fs.readFileSync(path,options,callback)
- 参数
- path:文件路径,一般我们会选择相对路径
- options:object||string,
- encoding:string||null,文件编码,默认为null
- flag:string,默认值为r
- callback,回调函数,当读取完成后执行的回调函数
- err,错误信息
- data,文件内容,string||buffer
- 实例
const fs = require('fs') const path = require('path') fs.readFileSync(path.resolve('data.txt'),'utf-8',(err,data)=>{ console.log(err)// 如果没有错误err则是null if(!err){ console.log(data) //欢迎你 } }) fs.readFileSync(path.resolve('data.txt'),(err,data)=>{ console.log(err)// 如果没有错误err则是null if(!err){ console.log(data) //<Buffer e6 ac a2 e8 bf 8e e4 bd a0> } }) console.log('11111') <!--会先输出欢迎你,再输出buffer,最后输出11111-->
- 注意事项
- nodejs是错误优先,所以回调中第一个参数中存储的是错误信息
- 如果没有指定编码,则返回原始的buffer
- 如果options为字符串,我们默认它指定的是编码
- 当我们指定的是目录而非文件的时候,win、mac、linux会返回错误
writeFile:用异步的方式向指定文件中写入数据
- 作用:用异步的方式向指定文件中写入数据,如果文件已存在内容则会产生覆盖
- 语法
fs.writeFile(path,data[,options],callback)
- 参数
- path:文件路径,一般我们会选择相对路径
- data:要写入的内容,可以是字符串也可以是buffer
- options:object||string,
- encoding:string||null,文件编码,默认为utf-8
- mode:默认值为0o666
- flag:string,默认值为w
- callback,回调函数,当读取完成后执行的回调函数
- err,错误信息
- 实例
const fs = require('fs') const path = require('path') <!--data.txt中内容为'新的内容'--> fs.writeFile(path.resolve('data.txt'),'新的内容',(err)=>{ if(!err){ fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{ if(!err){ console.log(data) // 新的内容 } }) } }) <!--data2.txt中内容为123--> fs.writeFile(path.resolve('data2.txt'),'这是追加的内容','utf-8',(err)=>{ if(!err){ fs.readFile(path.resolve('data2.txt'),'utf-8',(err,data)=>{ if(!err){ console.log(data) // 123这是追加的内容 } }) } })
- 注意事项
- 如果写入的内容是buffer,则options中的encoding失效。
- 如果写入的文件已存在,则会覆盖原有文件内容
- 如果不存在,则创建文件并写入
- readFile如果文件路径不存在则报错,而writeFile如果文件路径不存在则会创建文件
- options中可以包含flag,比如我们改为a,则在原有文件中追加新内容
writeFileSync:用同步的方式向指定文件中写入数据
用法与异步写入相似
appendFile:追加的方式向指定文件中写入数据
- 作用:以异步追加的方式向指定文件写入数据,如果文件尚不存在则创建文件
- 语法
fs.appendFile(path,data[,options],callback)
- 参数
- path:文件路径,一般我们会选择相对路径
- data:要写入的内容,可以是字符串也可以是buffer
- options:object||string,
- encoding:string||null,文件编码,默认为utf-8
- mode:默认值为0o666
- flag:string,默认值为a
- callback,回调函数,当读取完成后执行的回调函数
- err,错误信息
- 实例
const fs = require('fs') const path = require('path') <!--data.txt中内容为'append'--> fs.appendFile(path.resolve('data.txt'),'追加的新内容',(err)=>{ if(!err){ fs.readFile(path.resolve('data.txt'),'utf-8',(err,data)=>{ if(!err){ console.log(data) // append追加的新内容 } }) } })
- 注意事项
- 如果写入的内容是buffer,则options中的encoding失效。
- 如果options是字符串,则它指定字符编码
- 如果文件不存在,则创建文件并写入
appendFileSync:同步追加的方式向指定文件中写入数据
用法类似于appendFile
copyFile:将某个文件中的数据拷贝至另一份文件
- 作用:异步的将某个文件中的数据拷贝至另一份文件,默认情况下,如果dest存在则覆盖它,否则创建文件
- 语法
fs.copyFile(src,dest[,mode],callback)
- 参数
- src:要拷贝的源文件
- dest:内容存放的目标文件
- mode:用于拷贝操作的修饰符。默认值
- callback,回调函数
- 实例
const fs = require('fs') const path = require('path') <!--项目文件夹中有data.txt文件,但没有test1.txt--> fs.copyFile('data.txt','test1.txt',(err)=>{ console.log(err) })
- 注意事项
- 如果dest文件不存在,则创建文件并写入
- 如果src文件不存在,会报异常
copyFileSync:将某个文件中的数据拷贝至另一份文件
- 作用:同步的将某个文件中的数据拷贝至另一份文件,默认情况下,如果dest存在则覆盖它,否则创建文件
其他类似于copyFile
watchFile: 对指定文件进行监控,当内容发生变化时执行回调函数
- 作用:监视文件的变化,每当访问文件时都会调用回调函数
- 语法
fs.watchFile(file[,options],listener)
- 参数
- file:要监听的文件
- options
- bigint:如果 bigint 选项为 true,则这些对象中的数值会被指定为 BigInts 类型。,默认值为false
- persistent:默认true,当文件正在被监视时,进程是否应该继续运行
- interval:默认值5007,指示轮询目标的频率,单位毫秒
- listener
- curr:stat对象
- prev:stat对象
- 实例
const fs = require('fs') const path = require('path') <!--项目文件夹中有data.txt文件,但没有test1.txt--> fs.watchFile('data.txt',(cuur,prev)=>{ if(cuur.mtime!=prev.mtime){ console.log('修改了文件') } }) //stat对象的形式如下: Stats { dev: 163689085, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: 4096, ino: 1688849861265423, size: 14, blocks: 0, atimeMs: 1620382991134.3672, mtimeMs: 1620382991134.3672, ctimeMs: 1620382991134.3672, birthtimeMs: 1620369691230.5874, atime: 2021-05-07T10:23:11.134Z, mtime: 2021-05-07T10:23:11.134Z, ctime: 2021-05-07T10:23:11.134Z, birthtime: 2021-05-07T06:41:31.231Z }
- 注意事项
- 要在修改文件(而不仅仅是访问)时收到通知,则需要比较 curr.mtime 和 prev.mtime不相等。