更多内容去查看官方文档
一,path
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const path = require('path') const basePath="\\user\\why" const fileName="abc.txt" const filePath=path.resolve(basePath,fileName) console.log("1. "+filePath);
console.log("2. "+path.dirname(filePath));
console.log("2. "+path.basename(filePath));
console.log("2. "+path.extname(filePath));
console.log("3. "+path.join(basePath,fileName))
|
二,File System
文件的API大多数都提供三种操作方式,一般都有promises方法
- 同步操作文件:代码会被阻塞,不会继续执行
- 异步回调函数操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行
- 异步Promise操作文件:代码不会被阻塞,通过 fs.promises 调用方法操作,会返回一个Promise, 可以通过then、catch进行处理
1. 三种使用方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| const fs=require('fs')
const filePath=('./a.txt')
const info=fs.statSync(filePath)
fs.stat(filePath,(err,info)=>{ if(err){ console.log(err); return } console.log(info); }) console.log('因为没阻塞,所以先执行了下面的代码');
fs.promises.stat(filePath).then(info=>{ console.log(info); }).catch(err=>{ console.log(err); })
|
2. 文件描述符
https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6/9809582?fr=aladdin
3. 文件读写
- w 打开文件写入,默认值;
- w+打开文件进行读写,如果不存在则创建文件;
- r+ 打开文件进行读写,如果不存在那么抛出异常;
- r打开文件读取,读取时的默认值;
- a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;
- a+打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件
1 2 3 4 5 6 7 8 9 10 11 12 13
| const fs = require('fs')
const content="你好呀,小叶子" const appen="我们有机会嘛" fs.writeFile('./a.txt',appen,{flag:"a"},err=>{ console.log(err); })
fs.readFile("./a.txt",{encoding:'utf-8'},(err,data)=>{ console.log(data); })
|
4. 文件夹操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| const fs = require('fs') const path=require('path')
const dirname='./why' if(!fs.existsSync(dirname)){ fs.mkdir(dirname,err=>{ console.log(err); }) }
fs.readdir(dirname,(err,files)=>{ console.log(files); })
function getFiles(dirname){ fs.readdir(dirname,{withFileTypes:true},(err,files)=>{ for(let file of files){ if(file.isDirectory()){ const filepath = path.resolve(dirname,file.name) getFiles(filepath) }else{ console.log(file.name); } } }) } getFiles(dirname)
|
5. 写node脚本的注意点
- 传值:使用process.argv[x]来读取传入的参数
- .padStart(2,0):这个方法可以补齐0 ,如01,02
三,event模块
类似人体的反应,比如手摸火,手发射事件,大脑监听做出已经设置好的反应。
- Node中的核心API都是基于异步事件驱动的
- 在这个体系中,某些对象(发射器(Emitters))发出某一个 事件
- 我们可以监听这个事件(监听器 Listeners),并且传入的回 调函数,这个回调函数会在监听到事件时调用
- 发出事件和监听事件都是通过EventEmitter类来完成的,它们都属 于events对象
- emitter.on(eventName, listener):监听事件,也可以使用 addListener
- emitter.off(eventName, listener):移除事件监听,也可以使 用removeListener
- emitter.emit(eventName[, …args]):发出事件,可以携带一 些参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const EventEmitter=require('events')
const emitter = new EventEmitter()
emitter.on('click',(args)=>{ console.log('监听1到click事件',args); }) const lis2=(args)=>{ console.log('监听2到click事件',args); } emitter.on('click',lis2)
setTimeout(()=>{ emitter.emit('click','露西','艾尔莎') emitter.off('click',lis2) emitter.emit('click','露西','艾尔莎') },1000)
|