文件操作

使用 Linux 命令 ls -al 来查目录中文件和文件夹的权限位
drwxr-xr-x 1 PandaShen 197121 0 Jun 28 14:41 core
-rw-r--r-- 1 PandaShen 197121 293 Jun 23 17:44 index.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)
文件 读 写 拷贝 监听
const fs = require('fs')const path = require('path')// readFilefs.readFile(path.resolve('index.html'),'utf-8',(err,data)=>{console.log(data)})// writeFilefs.writeFile('data.txt','hello world',(err)=>{console.log('written done')})// appendFile 追加内容fs.appendFile('data.txt','are you ok',(err)=>{console.log('append done')})// copyFilefs.copyFile('dd.txt','hello.txt',(err)=>{console.log('copy done')})// wathFilefs.watchFile('data.txt',{interval:20},(curr,prev)=>{if(curr.mtime !== prev.mtime){console.log('modified')fs.unwatchFile('data.txt')}})
文件的打开 关闭
const fs = require('fs')const path = require('path')// openfs.open(path.resolve('data.txt'),'r',(err,fd)=>{fs.close(fd,err=>{console.log('closed')})})
大文件读写
大文件的读写需要先打开文件
const fs = require('fs')let buf = Buffer.alloc(10)// read 从文件读然后写入到buffer/*** fd 定位当前打开的文件* buf 表示缓冲区* offset 表示从buf的那个位置开始写入* length 表示写入长度* position 表示从文件的那个位置开始读取*/fs.open('data.txt','r',(err,rfd)=>{fs.read(rfd,buf,0,3,0,(err,bytesRead,data)=>{console.log(bytesRead) //从文件中读取了多少字节console.log(data)console.log(data.toString())})})// write 从buffer写入文件const buf2 = Buffer.from('1321456456')fs.open('dd.txt','w',(err,wfd)=>{fs.write(wfd,buf2,2,4,0,(err,bytesWritten,buffer)=>{console.log(written) // 写入文件了多少字节console.log(buffer.toString())})})
大文件拷贝
const fs = require('fs')const BUFFER_SIZE = 10const buf = Buffer.alloc(BUFFER_SIZE)let readOffset = 0fs.open('a.txt','r',(err,rfd)=>{fs.open('b.txt','w',(err,wfd)=>{function next() {fs.read(rfd,buf,0,BUFFER_SIZE,readOffset,(err,bytesRead)=>{if(!bytesRead){fs.close(rfd,()=>{})fs.close(wfd,()=>{})return}readOffset += bytesReadfs.write(wfd,buf,0,bytesRead,(err,bytesWritten)=>{next()})})}next()})})
文件夹操作
文件夹操作
const fs = require('fs')// access 查看文件或文件夹是否有权限fs.access('a.txt',(err)=>{if(!err){console.log('有权限')}})// stat 查看文件或者文件夹状态fs.stat('a.txt',(err,state)=>{console.log(state.size)console.log(state.isFile())console.log(state.isDirectory())})//mkdirfs.mkdir('a/b/c',{recursive:true},(err)=>{if(!err){console.log('创建成功')}})// mkdir 如果不是recursive,前面部分文件路径确实存在,才会创建最后一部分fs.mkdir('h/j',(err)=>{if(!err){console.log('创建成功')}})// rmdirfs.rmdir('d/e/f',{recursive:true},(err)=>{if(!err){console.log('删除成功')}})// readdirfs.readdir('h',(err,files)=>{console.log(files)})
同步创建文件夹
const fs = require('fs')const path = require('path')function makeDirSync(dirPath) {let items = dirPath.split(path.sep)for (let index = 1; index <= items.length; index++) {let dir = items.slice(0,index).join(path.sep)try {fs.accessSync(dir)} catch (error) {fs.mkdirSync(dir)}}}makeDirSync('a/b/c')
promisify api 创建
const fs = require('fs')const path = require('path')const { promisify } = require('util')const access = promisify(fs.access)const mkdir = promisify(fs.mkdir)async function myMkdir(dirPath) {let parts = dirPath.split(path.sep)for (let index = 1; index <= parts.length; index++) {let current = parts.slice(0,index).join(path.sep)try {await access(current)} catch (error) {await mkdir(current)}}}myMkdir('a/b/c')
