提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、node的核心模块
主要介绍node的path模块,fs模块。
实现案例:通过path+fs模块实现复制文件夹里面的所有内容到另外一个文件
1.path模块
1.1.从路径中获取信息
- dirname 获取文件的父文件夹
- basename 获取文件名
- extname 获取文件的扩展名
代码如下(示例):
const path = require('path')
const filepath = '/User/why/abc.txt'; //模拟路径
//获取路径中的父级文件夹 dirname
console.log(path.dirname(filepath)); // /User/why
//获取路径中文件名 basename
console.log(path.basename(filepath)); // abc.txt
//获取路径中的扩展名
console.log(path.extname(filepath)); // .txt
1.2.路径拼接
- path.join() 多个路径进行拼接
- path.resolve() 会判断我们拼接的路径前面是否有 /或…/或./;有的话会解析成绝对路径
代码如下(示例):
// 1.join路径拼接
const path = require('path')
const basepath = '../User/why';
const filename = './abc.txt';
const filepath1 = path.join(basepath, filename);
console.log(filepath1); // ..\User\why\abc.txt
//2.resolve路径拼接
// resolve会判断拼接的路径字符串中,是否有以/或./或../开头的路径
const filepath2 = path.resolve(basepath, filename);
console.log(filepath2);
// 1. (../开头)会先找到相对于该文件的上级目录的绝对路径
// 2. (绝对路径)F:\node\学习\code\01_learn-node\05_常见的内置模块
// 3. 拼接 F:\node\学习\code\01_learn-node\05_常见的内置模块 + /User/why + abc.txt (最终结果)
// F:\node\学习\code\01_learn-node\05_常见的内置模块\User\why\abc.txt
总结:join方法只会进行路径拼接不会解析成绝对路径,而resolve方法会解析成绝对路径后在进行拼接
2.fs模块
- fs.statSync 读取文件信息(大小,创建时间等等)不加sync为异步调用采用回调函数接收文件信息
- fs.writeFile 文件的写入
- fs.readFile 文件的读取
- fs.mkdir 创建文件夹
- fs.readdir 文件夹的读取
- fs.copyFileSync 文件的复制
代码如下(示例):
- 示例fs.stat
//引入fs模块
const fs = require('fs');
//先在当前文件夹下创建一个abc.txt文件 (省略目录结构截图)
// 案例: 读取文件的信息
const filepath = "./abc.txt";
// 1.方式一: 同步操作
const info = fs.statSync(filepath);
console.log("后续需要执行的代码");
console.log(info);
// 2.方式二: 异步操作
// fs.stat(filepath, (err, info) => {
// if (err) {
// console.log(err);
// return;
// }
// console.log(info);
// console.log(info.isFile());
// console.log(info.isDirectory());
// });
// console.log("后续需要执行的代码");
//结果:包括文件大小,创建时间
Stats {
dev: 168626483,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 1125899906960302,
size: 41,
blocks: 0,
atimeMs: 1658990688875.9424,
mtimeMs: 1602856031000,
ctimeMs: 1656482928212.2583,
birthtimeMs: 1656482928211.2617,
atime: 2022-07-28T06:44:48.876Z,
mtime: 2020-10-16T13:47:11.000Z,
ctime: 2022-06-29T06:08:48.212Z,
birthtime: 2022-06-29T06:08:48.211Z
}
- 示例 fs.writeFile && fs.readFile
//1.文件写入
const fs = require('fs');
//先在当前目录下创建一个abc.txt文件 (省略目录结构截图)
// 案例: 文件的读写
const content = "你好,小明";
//flag:"a" 为追加文件内容不是覆盖原有的文件内容
fs.writeFile('./abc.txt', content, {flag: "a"}, err => {
console.log(err);
});
// 结果:在bac.txt文件中添加了 "你好,小明"
//2.文件读取
//采用utf-8的字符编码进行读文件
fs.readFile("./abc.txt", {encoding: 'utf-8'}, (err, data) => {
console.log(data); // "你好,小明"
});
- 示例 fs.mkdir && fs.readdir
const fs = require('fs');
const path = require('path');
// 1.创建文件夹
const dirname = './newDir'; //在当前文件夹下创建一个newDir文件夹
if (!fs.existsSync(dirname)) { //判断文件夹是否已经存在
fs.mkdir(dirname, err => { //创建文件夹
console.log(err);
});
}
//2读文件夹
//加{withFileTypeS:true} 会返回数组对象,对象包含文件夹里面的每个文件的信息,如果不写的话只能拿到数组,数组每一项是文件名
fs.readdir(dirname, { withFileTypes: true }, (err, files) => {
for (let file of files) {
console.log(file.name)
}
练习案例
- 目标:将oldFile文件夹里面的所有东西复制一份到新的newFile文件夹中
完成前的目录结构
完成后的目录结构
代码如下(示例):
//导入核心模块
const path = require('path')
const fs = require('fs')
//获取到
let newFilePath = path.resolve(__dirname,'newFile')
let oldFilePath = path.resolve(__dirname,'oldFile')
//判断新目录下面是否存在newFile文件夹,不存在就创建一个newFile文件夹
if(!fs.existsSync(newFilePath)){
fs.mkdir(newFilePath ,err=>{
// console.log(err)
})
}
//递归 (文件夹套文件夹)的结构,直到拿到文件为止
const path = require('path')
const fs = require('fs')
// 获取oldFile文件夹,newFile的绝对路径
let OriginFilePath = path.resolve(__dirname,'oldFile')
let CopyFilePath = path.resolve(__dirname,'newFile')
//判断要创建的文件夹(newFile)是否存在,不存在就创建一个
if(!fs.existsSync(CopyFilePath)){
fs.mkdir(CopyFilePath,err=>{
// console.log(err)
})
}
//传入路径
getFiles(OriginFilePath,CopyFilePath)
function getFiles(OriginFilePath,CopyFilePath){
//读取newFile文件夹下的文件
fs.readdir(OriginFilePath,{withFileTypes:true},(err,files)=>{
for(let file of files){
//判断是否是文件夹,不是则直接复制文件到newFile中
if(!file.isDirectory()){
//获取旧文件夹中要复制的文件
const OriginFile = path.resolve(OriginFilePath,file.name)
//获取新文件夹中复制的地方
const CopyFile = path.resolve(CopyFilePath,file.name)
//将文件从旧文件夹复制到新文件夹中
fs.copyFileSync(OriginFile,CopyFile)
}else{//如果是文件夹就递归变量把最新的文件夹路径传过去
const CopyDirPath = path.resolve(CopyFilePath,file.name)
const OriginDirPath = path.resolve(OriginFilePath,file.name)
fs.mkdir(CopyDirPath,(err)=>{
})
// OriginFilePath = OriginPath
// CopyFilePath = DirPath
getFiles(OriginDirPath,CopyDirPath)
}
}
})
}