文件操作
使用 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')
// readFile
fs.readFile(path.resolve('index.html'),'utf-8',(err,data)=>{
console.log(data)
})
// writeFile
fs.writeFile('data.txt','hello world',(err)=>{
console.log('written done')
})
// appendFile 追加内容
fs.appendFile('data.txt','are you ok',(err)=>{
console.log('append done')
})
// copyFile
fs.copyFile('dd.txt','hello.txt',(err)=>{
console.log('copy done')
})
// wathFile
fs.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')
// open
fs.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 = 10
const buf = Buffer.alloc(BUFFER_SIZE)
let readOffset = 0
fs.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 += bytesRead
fs.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())
})
//mkdir
fs.mkdir('a/b/c',{recursive:true},(err)=>{
if(!err){
console.log('创建成功')
}
})
// mkdir 如果不是recursive,前面部分文件路径确实存在,才会创建最后一部分
fs.mkdir('h/j',(err)=>{
if(!err){
console.log('创建成功')
}
})
// rmdir
fs.rmdir('d/e/f',{recursive:true},(err)=>{
if(!err){
console.log('删除成功')
}
})
// readdir
fs.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')