1.path模块
path包括常用方法:
- path.resolve([from…],to)//from为选填,path.resolve() 该方法将一些的路径解析为绝对路径。会根据是否有/或//或./或…/或反斜杠\来判断如何拼接
- path.join(path1,path2…)join是把各个path片段连接在一起
- path.dirname(path)//输出该文件所在的目录的绝对路径
- path.basename(path)//整个文件的名字
- path.extname(path)//文件的后缀名
path.join()和path.resolve()区别:
详见:https://zhuanlan.zhihu.com/p/27798478
注意使用内置模块一定要先导入模块,上面用的require方式。import方式也是一样可以导入的:
import path from ‘path’
path.resolve在webpack中的使用:我们在alias可以重定义我们的路径来方便导入。原理就是借助path.resolve获得我们src里的绝对路径可以直接@/components/han.vue进入到src目录下的components目录拿到han.vue组件
2. 文件系统.内置模块fs(fs即File System的缩写)
Node可以帮助我们封装文件系统,我们可以在任何的操作系统(windows,Mac OS,Linux)上面操作文件。这大大提高了我们的开发效率。
我们在上图的官网的文档可以看到,文件系统一般一个方法有三种api。而三种api都是不同的操作方式
例如:
stat获取文件信息
的三种方式:
同步方式:
const info = fs.statSync('./README.md',)
console.log(info);
console.log('后续代码');
异步回调方式:
注意:
第一个参数是error信息,第二个参数才是info信息
const fs = require('fs')
fs.stat('./README.md',(err, info) => {
if(err) return
console.log(info);
})
console.log('后续代码');
promise解决回调地狱:
fs.promises.stat('./README.md')
.then(info => {
console.log(info);
})
.catch(err => {
console.log(err);
})
console.log('后续代码');
stat获取的info可以通过isFile()和isDirectory()来判断是文件还是文件夹
文件描述符
每个打开的文件都分配了一个成为文件描述符来标识和跟踪每个特定的文件。内核利用文件描述符来访问文件。读写文件也需要使用文件描述符来指定待读写的文件。
通过open方法可以拿到我们的文件描述符fd,fd其实就是一个数字,只要是正常打开那这个数字就是一个非负整数
例如:
const fs = require('fs')
fs.open('./a.txt',(err, fd) => {
if(err) return;
//通过描述符获取信息一般要在常用api前缀加上f,并且传入的是文件描述符而不是文件路径
fs.fstat(fd, (err,info) => {
clg(info)
})
})
写入文件fs.writeFile/fs.writeFileSync
- ** fs.writeFile(‘文件路径’,‘要写入的内容’,[‘option配置操作’],‘回调函数’);注意回调函数只有一个error参数 写入的时候如果没有这个文件,会自动创建这个文件。如果被写入的文件已存在内容,那么写入的话,会覆盖之前的内容**
option有两种参数,一个是设置
flag选项
,一个是
encoding编码选项
例如:
fs.writeFile('./a.txt','yesyesyes',{flag: 'a+'}, err => {
clg(err)
})
//这样即可在a.txt文件末尾加上yesyesyes的字符串
flag的常用选项
读取文件fs.readFile/fs.readFileSync
- 回调函数参数和wirteFile不同,readFile会有一个data数据
- 读取文件时如果不写encoding,返回结果时Buffer
const fs = require('fs')
fs.readFile('./README.md',(err, info) => {
if(err) return
console.log(info);
})
结果为:
加上encoding后:
const fs = require('fs')
fs.readFile('./README.md',{encoding: 'UTF-8'},(err, info) => {
if(err) return
console.log(info);
})
结果为:
常用的文件夹操作
- mkdir:创建文件夹
- existsSync:是否存在这个文件
const dirname = './why';
if (!fs.existsSync(dirname)) {
fs.mkdir(dirname, err => {
console.log(err);
});
}
- fs.readdir:读取文件夹的所有文件(第二个参数files是一个数组)
fs.readdir(dirname, (err, files) => {
console.log(files);
});
如果想读取文件夹下的所有文件(容易出现文件夹下还有文件夹的情况,fs.readdir的配置withFileTypes可以带上文件类型)
利用递归即可实现
const fs = require('fs')
const path = require('path')
const dirname = './why';
function getAllFileName(dirname) {
fs.readdir(dirname, { withFileTypes: true },(err, files) => {
if(err) return;
for (const item of files) {
if (item.isDirectory()) {
const filepath = path.resolve(dirname, item.name);
getAllFileName(filepath);
} else {
console.log(item.name);
}
}
})
}
getAllFileName(dirname)