文件操作

截屏2021-07-03 下午6.49.32.png
使用 Linux 命令 ls -al 来查目录中文件和文件夹的权限位

  1. drwxr-xr-x1PandaShen1971210Jun 28 14:41core
  1. -rw-r--r-- 1PandaShen197121293Jun 23 17:44index.md

第一位代表是文件还是文件夹,d 开头代表文件夹,- 开头的代表文件,而后面九位就代表当前用户、用户所属组和其他用户的权限位,按每三位划分,分别代表读(r)、写(w)和执行(x),- 代表没有当前位对应的权限。

标识位 flag

r 读取文件,如果文件不存在则抛出异常。
r+ 读取并写入文件,如果文件不存在则抛出异常。
rs 读取并写入文件,指示操作系统绕开本地文件系统缓存。
w 写入文件,文件不存在会被创建,存在则清空后写入。
wx 写入文件,排它方式打开。
w+ 读取并写入文件,文件不存在则创建文件,存在则清空后写入。
wx+ 和 w+ 类似,排他方式打开。
a 追加写入,文件不存在则创建文件。
ax 与 a 类似,排他方式打开。
a+ 读取并追加写入,不存在则创建。
ax+ 与 a+ 类似,排他方式打开。

[

](https://blog.csdn.net/github_38140984/article/details/83006101)

文件 读 写 拷贝 监听

  1. const fs = require('fs')
  2. const path = require('path')
  3. // readFile
  4. fs.readFile(path.resolve('index.html'),'utf-8',(err,data)=>{
  5. console.log(data)
  6. })
  7. // writeFile
  8. fs.writeFile('data.txt','hello world',(err)=>{
  9. console.log('written done')
  10. })
  11. // appendFile 追加内容
  12. fs.appendFile('data.txt','are you ok',(err)=>{
  13. console.log('append done')
  14. })
  15. // copyFile
  16. fs.copyFile('dd.txt','hello.txt',(err)=>{
  17. console.log('copy done')
  18. })
  19. // wathFile
  20. fs.watchFile('data.txt',{interval:20},(curr,prev)=>{
  21. if(curr.mtime !== prev.mtime){
  22. console.log('modified')
  23. fs.unwatchFile('data.txt')
  24. }
  25. })

文件的打开 关闭

  1. const fs = require('fs')
  2. const path = require('path')
  3. // open
  4. fs.open(path.resolve('data.txt'),'r',(err,fd)=>{
  5. fs.close(fd,err=>{
  6. console.log('closed')
  7. })
  8. })

大文件读写

大文件的读写需要先打开文件

  1. const fs = require('fs')
  2. let buf = Buffer.alloc(10)
  3. // read 从文件读然后写入到buffer
  4. /**
  5. * fd 定位当前打开的文件
  6. * buf 表示缓冲区
  7. * offset 表示从buf的那个位置开始写入
  8. * length 表示写入长度
  9. * position 表示从文件的那个位置开始读取
  10. */
  11. fs.open('data.txt','r',(err,rfd)=>{
  12. fs.read(rfd,buf,0,3,0,(err,bytesRead,data)=>{
  13. console.log(bytesRead) //从文件中读取了多少字节
  14. console.log(data)
  15. console.log(data.toString())
  16. })
  17. })
  18. // write 从buffer写入文件
  19. const buf2 = Buffer.from('1321456456')
  20. fs.open('dd.txt','w',(err,wfd)=>{
  21. fs.write(wfd,buf2,2,4,0,(err,bytesWritten,buffer)=>{
  22. console.log(written) // 写入文件了多少字节
  23. console.log(buffer.toString())
  24. })
  25. })

大文件拷贝

  1. const fs = require('fs')
  2. const BUFFER_SIZE = 10
  3. const buf = Buffer.alloc(BUFFER_SIZE)
  4. let readOffset = 0
  5. fs.open('a.txt','r',(err,rfd)=>{
  6. fs.open('b.txt','w',(err,wfd)=>{
  7. function next() {
  8. fs.read(rfd,buf,0,BUFFER_SIZE,readOffset,(err,bytesRead)=>{
  9. if(!bytesRead){
  10. fs.close(rfd,()=>{})
  11. fs.close(wfd,()=>{})
  12. return
  13. }
  14. readOffset += bytesRead
  15. fs.write(wfd,buf,0,bytesRead,(err,bytesWritten)=>{
  16. next()
  17. })
  18. })
  19. }
  20. next()
  21. })
  22. })

文件夹操作

文件夹操作

  1. const fs = require('fs')
  2. // access 查看文件或文件夹是否有权限
  3. fs.access('a.txt',(err)=>{
  4. if(!err){
  5. console.log('有权限')
  6. }
  7. })
  8. // stat 查看文件或者文件夹状态
  9. fs.stat('a.txt',(err,state)=>{
  10. console.log(state.size)
  11. console.log(state.isFile())
  12. console.log(state.isDirectory())
  13. })
  14. //mkdir
  15. fs.mkdir('a/b/c',{recursive:true},(err)=>{
  16. if(!err){
  17. console.log('创建成功')
  18. }
  19. })
  20. // mkdir 如果不是recursive,前面部分文件路径确实存在,才会创建最后一部分
  21. fs.mkdir('h/j',(err)=>{
  22. if(!err){
  23. console.log('创建成功')
  24. }
  25. })
  26. // rmdir
  27. fs.rmdir('d/e/f',{recursive:true},(err)=>{
  28. if(!err){
  29. console.log('删除成功')
  30. }
  31. })
  32. // readdir
  33. fs.readdir('h',(err,files)=>{
  34. console.log(files)
  35. })

同步创建文件夹

  1. const fs = require('fs')
  2. const path = require('path')
  3. function makeDirSync(dirPath) {
  4. let items = dirPath.split(path.sep)
  5. for (let index = 1; index <= items.length; index++) {
  6. let dir = items.slice(0,index).join(path.sep)
  7. try {
  8. fs.accessSync(dir)
  9. } catch (error) {
  10. fs.mkdirSync(dir)
  11. }
  12. }
  13. }
  14. makeDirSync('a/b/c')

promisify api 创建

  1. const fs = require('fs')
  2. const path = require('path')
  3. const { promisify } = require('util')
  4. const access = promisify(fs.access)
  5. const mkdir = promisify(fs.mkdir)
  6. async function myMkdir(dirPath) {
  7. let parts = dirPath.split(path.sep)
  8. for (let index = 1; index <= parts.length; index++) {
  9. let current = parts.slice(0,index).join(path.sep)
  10. try {
  11. await access(current)
  12. } catch (error) {
  13. await mkdir(current)
  14. }
  15. }
  16. }
  17. myMkdir('a/b/c')