常用模块
path 模块
// 引入path模块
const path = require('path')
// path.resolve 和 path.join 路径拼接
const basePath = '../User/node'
const fileName = 'abc.txt'
// resolve会查找拼接路径前面是不是有/ 如果没有/ 则会
在前面加上当前路径的根路径
path.resolve(basePath, fileName)
// join只会按步就班的拼接
path.join(basePath, fileName)
// 获取路径的信息
const filePath = '/User/node/abc.txt'
// 获取路径
path.dirname(filePath)
// 获取文件名
path.basename(filepath)
// 获取文件后缀 txt
path.extname(filepath)
fs 模块
读取文件信息
// 引入fs模块
const fs = require('fs')
// 读取文件信息,利用 stat, 有三种方式
const filepath = './abc.txt'
// 方式一 同步操作 阻塞
const stat = fs.statSync(filepath)
// 方式二 异步操作 非阻塞
fs.stat(filepath, (err, info) => {
if (err) {
console.log(err)
return
}
console.log(info)
})
// 方式三: promise 非阻塞
fs.promises.stat(filepath).then(info => {
console.log(info)
}).catch(err => {
console.log(err)
})
文件读写
const content = 'hello node'
// 直接写会直接把内容覆盖掉, 如果文件不存在,会进行创建
fs.writeFile('./abc.txt', content, err => {
if (err) {
console.log(err)
return;
}
console.log('创建写入成功')
} )
// 文件追加 添加 { flag: 'a' }
fs.writeFile('./abc.txt', content, {flag: 'a' }, err => {
console.log(err)
} )
// 文件追加也可以利用appendFile
fs.appendFile('./css/index.less', '\nbody{color: red}', err => {
if (err) {
console.log(err)
return;
}
console.log('追加成功')
})
// 文件读取,不指定编码 data则是buffer数据
fs.readFile('./css/index.less', (err,data) => {
if (err) {
console.log(err)
return;
}
console.log(data) // data 是buffer
data.toString() // 将buffer 转为toString
console.log(data.toString())
})
// 文件读取,指定utf-8编码
fs.readFile('./abc.txt', { encoding: 'utf-8' }, (err, info) => {
console.log(info)
})
//fs.unlink 删除文件
fs.unlink('./css/aaa.less', err => {
if (err) {
console.log(err)
return;
}
console.log('删除文件成功')
})
文件夹操作
// fs.stat 检测文件是文件还是目录
fs.stat('./module', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(`是文件: ${data.isFile()}`)
console.log(`是目录: ${data.isDirectory()}`)
})
// fs.mkdir 创建目录 目录 权限(777) 回调
fs.mkdir('./css', err => {
if (err){
console.log(err);
return;
}
console.log('创建成功')
})
// fs.rmdir 删除目录
fs.rmdir('./css/aaa.less', err => {
if (err) {
console.log(err)
return;
}
console.log('删除目录成功')
})
// 读取文件夹中的所有文件, 返回数组,如果文件夹里面有文件夹,
// 只会显示文件夹名称,深层次的文件不会显示
fs.readdir(dirname, (err, files) => {
console.log(files)
})
// fs.rename 重命名 和 移动文件
fs.rename('./css/aaa.css','./css/index.css', err => {
if (err) {
console.log(err)
return;
}
console.log('重命名成功')
})
读取文件夹里面的所有文件(查询深层次)-- 利用递归
const getFiles = (dirname) => {
fs.readdir(dirname, { withFileTypes: true}, (err, files) => {
files.forEach(item => {
if (item.isDirectory()) {
// 需要路径,拼接起来
const itemPath = path.resolve(dirname, item.name)
getFiles(itemPath)
} else {
console.log(item.name)
}
})
})
}
getFiles(文件夹路径)
event
基础使用
const EventEmitter = require('events')
// 创建发射器
const emitter = new EventEmitter()
// 监听一个事件
emitter.on('click', (args) => {
console.log('监听到了click事件', args)
})
// 发射一个事件
emitter.emit("click", 'node参数')
// 移除所有的监听
emitter.removeAllListeners();
// 移除click事件监听
emitter.removeAllListeners('click');
// 将此次监听放到最前面
emitter.prependListener('click', (args) => {
console.log("将此次监听放到最前面", args)
})
// 只监听一次事件 once
emitter.once('clicks', (args) => {
console.log("只监听一次", args)
// 所以发射了两次clicks事件,这里只打印了一次
})
emitter.emit("clicks", 'danilelee')
emitter.emit("clicks", 'danilelee')
// 获取监听的所有事件
emitter.eventNames()
// 获取监听事件的个数
emitter.listenerCount("clicks") // 1