这篇文章来谈一谈node的内置模块之一fs文件系统模块。
有很多api,下面来说一下比较常见的api:
readFile(path,callback)
异步操作
fs.readFile("../q.txt",(err,data)=>{
console.log(data);
})
readFileSync(path)
同步操作
const read = fs.readFileSync("../q.txt") 同步读取
writeFile(path,content[,options],callback)
异步操作:options为可选项。重要点的是追加功能。‘a’
fs.writeFile("./大哥.css","余文小布余文小布余文小布",{flag:'a'},()=>{})
writeFileSync --同步操作
writeFileSync(path,content[, options])
同步删除 unlink(path,callback)
异步删除 unlinkSync(path)
fs.unlink('./1.js',(err)=>{
console.log(err)
})
const data=fs.unlinkSync('./1.js')
mkdir(path,callback)—异步创建
mkdirSync(path)—同步创建
rmdir(path,callback)—异步删除
rmdirSync(path)----同步删除
readdir(path,callback)
readdirSync(path)
数组结构的 文件夹下面的所有的子文件 子文件夹,深度只嵌套到第一层
exitsSync(path)
返回boolean,存在返回true,不存在返回false。
rename(oldpath,newpath,callback)
renameSync(oldpath,newpath)
watch(path,callback)
回调函数有两个参数
第一个参数:触发的事件 rename change
第二个参数:修改或添加或删除的文件名
为什么需要文件流呢?
来看一个例子
const fs = require('fs')
fs.readFile('./1.txt', (res, data) => {
fs.writeFile('./copy.txt', data, (err, data) => {
console.log("写入完成");
})
})
这样是一次性读取,一次性写入,如果文件非常大的话,我们这样会对用户造成极为不好的体验。因此我们采用流的方式来读取文件。先来看看原生的方法怎么写?
const fs = require('fs')
const read = fs.createReadStream('./1.txt')
const write = fs.createWriteStream('./2.txt')
console.log(read.readableFlowing, '1');
read.resume()
console.log(read.readableFlowing, '2');
let res = ""
read.on('data', (data) => {
res += data
})
read.on('end', () => {
write.write(res)
})
语法糖写法:pipe()
const fs = require('fs')
const read = fs.createReadStream('./1.txt')
const write = fs.createWriteStream('./2.txt')
read.pipe(write)
读取流.pipe(写入流)