利用node中的内置模块fs实现对简单文件的读取 拷贝 创建等功能

时间:2024-03-10 22:19:18

1、文件的读取

我们想要根据如下一种目录生成一种json数据

代码如下

 1 //此函苏是对目录进行读取的
 2 
 3 //我们想要生成的是一个根据目录所创建的json数据
 4 
 5 const fs = require("fs");
 6 const path = require("path");
 7 
 8 function read(rootPath, name) {
 9     let opj = {};
10     //首先rootPath是我们想要创建的根目录路径 name是对象中的name属性 opj是我们想要生成的对象
11 
12     //第一步 我们要先判断下这个文件夹是不是存在
13     if (!fs.existsSync(rootPath)) return;
14     //第二步我们要判断这个路径是文件还是文件夹
15     if (fs.statSync(rootPath).isFile()) {
16         //如果是个文件的话 他的children属性就是这个文件内容
17         opj.name = name;
18         opj.type = "file";
19         opj.children = fs.readFileSync(rootPath, "utf8");
20     } else if (fs.statSync(rootPath).isDirectory()) {
21         //如果是个文件夹的话他的children属性有两种情况 
22         //空文件夹下不存在 不是空文件是个数组 数组继续放这些对象
23 
24         //首先判断文件夹内容
25         let child = fs.readdirSync(rootPath);
26         if (child.length) {
27             //非空文件夹情况
28             opj.name=name;
29             opj.type="dir";
30             opj.children = child.map(item => {//这里使用map是因为map返回数组这个特性
31                 let newPath=path.join(rootPath,item);//关键 利用这个方法合并路径
32                 console.log(newPath)
33                 return read(newPath,item)
34             })
35         }else{
36             //空文件的情况
37             opj.name=name;
38             opj.type="dir";
39         }
40     }
41     return opj;
42 }
43 
44 let data=read(path.join("./试验品文件"), "./试验品文件");
45 //大文件写入
46 let ws=fs.createWriteStream("./data.json")
47 ws.write(JSON.stringify(data))

 

2、创建文件夹目录

根据上面生成的data数据 在创建出上述的文件目录  代码如下

 1 const fs = require("fs");
 2 const path = require("path");
 3 const data = require("./data.js");
 4 
 5 function create(data) {
 6     //先根据数据创造出最外层文件夹
 7     //首先判断这个文件夹存在不存在 不存在创建 存在不创建
 8     let rootPath = data.name;
 9     //console.log(fs.existsSync(rootPath))
10     if (fs.existsSync(rootPath))return;
11     //不存在的情况 先创建
12     //创建之前判断我们是想创建文件还是文件夹
13     //console.log(data,"----")
14     if (data.type=="dir") {
15         //文件夹的情况
16         fs.mkdirSync(rootPath);
17         //创建完了最外层目录后 对数据的children属性进行循坏
18         data.children&&data.children.forEach(item => {
19             //循坏能得到每一个对象 然后递归在执行
20             //递归之前有个问题是路径问题 我们需要更改下name的名字
21             item.name=path.join(rootPath,item.name);
22             //console.log(item,"------------------------------------")
23             create(item)
24         })
25     }else if(data.type=="file"){
26         //文件的情况
27         fs.writeFileSync(rootPath,data.children);
28     }
29 
30 }
31 create(data.data)

 3、文件夹的拷贝

 1 const fs = require("fs");
 2 const path = require("path")
 3 
 4 function copy(dir, newDir) {
 5     //首先判断要拷贝的文件是不是存在
 6     if (!fs.existsSync(dir)) return;
 7     if (!fs.existsSync(newDir)) {
 8         //如果这个需要copy的文件不存在就创建他
 9         fs.mkdirSync(newDir);
10         //创建出这个文件夹后再循坏那个需要被拷贝的文件夹下面的东西
11         let child = fs.readdirSync(dir);
12         child.length && child.forEach(item => {
13             let dirs = path.join(dir, item);
14             let newDirs = path.join(newDir, item);
15             if (fs.statSync(dirs).isDirectory()) {
16                 console.log(dirs, newDirs)
17                 copy(dirs, newDirs)
18             } else {
19                 if (fs.statSync(dirs).size * 1 < 10485760) {
20                     //如果小于10MB证明是小文件
21                     console.log("小");
22                     //读取小文件
23                     let content = fs.readFileSync(dirs, "utf8");
24                     fs.writeFileSync(newDirs, content)
25 
26                 } else {
27                     //大于的话证明是大文件
28                     let rs=fs.createReadStream(dirs);
29                     let ws=fs.createWriteStream(newDirs);
30                     console.log(dirs,"大大大大大大大")
31                     rs.pipe(ws)
32                 }
33 
34             }
35 
36         })
37     }
38 }
39 
40 copy(path.join("./试验品文件"), path.join("./试验品文件副本"))