前言

这是第一个版本:

  1. 用来干什么:想干嘛干嘛
  2. 为什么写:写来玩,学习node.js文件系统相关api;树结构这种东西还是挺不错的,会用会造才是真的会
  3. 用了什么: fs.readdir(dir), fs.stat(dir).isFile(), path处理路径等
  4. 思路:
    • 读取当前文件夹(不是文件夹的另作处理),获得其下所有文件和目录组成的数组;
    • 循环该数组,判断是文件夹还是文件,文件的话直接push到childFiles(对象有两个属性:short文件名,full完整文件路径)
    • 文件夹的话,先把当前文件夹作为key,存到父级文件夹的childDir属性下,然后自调用传当前文件夹路径
    • 每一层文件夹都包含三个属性:dir文件夹路径,childFiles子文件,childDir子文件夹,存储为对象结构
    • 以上步骤重复,直到达到最底层空文件夹或该文件夹只有文件

改进:

  • 添加目录过滤规则(正则表达式);根据正则表达式,过滤(i)或只获取(c); 默认过滤["/node_modules|.git/i"]
  • 过滤的正则表达式格式:["regx"],如["/node_modules|.git/i"]["/components/"]
  • 添加结构树输出,类似tree或 treer ,类似在掘金到处可见的项目结构那种
  • 通过npm scripts使用不同的命令,添加不同的参数,process.env传递变量(过滤类型i/c,正则)

源码可以戳这里:github地址

一、输出的内容

  • components-dir-tree.json

{"dir": "D:\\node-test\\components","childFiles": [{"short": "components-dir-tree.json","full": "D:\\node-test\\components\\components-dir-tree.json"},{"short": "file.js","full": "D:\\node-test\\components\\file.js"},{"short": "index.js","full": "D:\\node-test\\components\\index.js"}],"childDir": {"no": null,"test": {"dir": "D:\\node-test\\components\\test","childFiles": [],"childDir": {"aa": {"dir": "D:\\node-test\\components\\test\\aa","childFiles": [{"short": "bb.js","full": "D:\\node-test\\components\\test\\aa\\bb.js"}],"childDir": {"cc": null}}}}}
}
复制代码
  • components-dir-tree.json: output

"output": "D:\\node-test\n└─ components\n    ├─ components-dir-tree1.json\n    ├─ file.2.js\n    ├─ file.bakeup.js\n    ├─ file.js\n    ├─ index.js\n    ├─ log.js\n    ├─ node-test-dir-tree.json\n    ├─ run-sh.js\n    ├─ test\n      └─ aa\n        ├─ bb.js\n        └─ cc\n    └─ timeFormat.js\n"
复制代码
 D:\node-test
├─ components├─ components-dir-tree1.json├─ file.2.js├─ file.bakeup.js├─ file.js├─ index.js├─ log.js├─ node-test-dir-tree.json├─ run-sh.js├─ test└─ aa├─ bb.js└─ cc└─ timeFormat.js
├─ index.js
├─ json├─ a.json└─ b.json
├─ package-lock.json
├─ package.json
├─ README.md
├─ scripts└─ generateComponent.js
└─ sh└─ sh1.js
复制代码

二、主函数 getDirTree

//components/file.2.js:
const fs = require('fs');
// 获取获取目录的类型,过滤i: ignore/包含c: contain
const type = process.env.getDirTreeType;
// 正则表达式 ["/node_modules|.git/i"]
let reg = process.env.getDirTreeReg;// 正则表达式转换
let modifier = reg.substring(reg.lastIndexOf('/')+1, reg.lastIndexOf(']')) || 'i'; // 修饰符
reg = reg.substring(reg.indexOf('/')+1, reg.lastIndexOf('/')); // 截取表达式模型reg = new RegExp(reg, modifier); // 生成正则表达式let firstRun = true; // getDirTree首次执行
let output = ''; // 生成目录结构字符串
/*** 获取目录下的文件树* @param {读取的路径} dir * @returns 返回 dir目录下的文件树*/
function getDirTree(dir) {let obj = {dir: dir,childFiles: [],childDir: {}};let objStr = JSON.stringify(obj);if (firstRun && isFile(dir)) return console.log(`${dir}: 不是文件夹`.redBG);let files = readDir(dir);if (firstRun) {output=`${dir}\n`;// 根据正则过滤文件、文件夹files = filesFilter(files);// 过滤之后的文件、文件夹列表log('files: ', files);}firstRun = false;// 遍历文件files.forEach((file, index) => {let tempdir = `${dir}\\${file}`;let dirname = getDirName(tempdir);// dir深度let dirDeep = new Array(tempdir.split('\\').length - 2).fill(0);dirDeep = dirDeep.reduce((acc,cur) => acc = (dirDeep.length > 1 ? '  ' : '') + acc, index === files.length - 1 ? '└─ ' : '├─ ');output += `${dirDeep}${dirname}\n`;obj.output = output;log('output: \n'.green, output);if (isFile(tempdir)) {obj.childFiles.push({short: file, // 文件名full: tempdir // 完整路径});} else {// console.log('tempdir: ',tempdir);// 在当前文件夹的对象下 childDir 属性(1),以文件夹名作为key(2),// (2)的值是该目录下 路径dir、childFiles子文件、childDir子文件夹组成的对象或nullobj.childDir[dirname] = getDirTree(tempdir);}});return JSON.stringify(obj) === objStr ? null : obj;
}
复制代码

三、工具函数

  • 目录过滤:

// 根据正则过滤文件、文件夹
function filesFilter(files) {switch (type) {case 'i': // 过滤掉忽略的文件、文件夹files = files.filter(item => !reg.test(item));break;case 'c': // 包含files = files.filter(item => reg.test(item));break;default:break;}return files;
}复制代码
  • 其他readDir/isFile/getDirName

// 读取路径下的文件、文件夹
function readDir(dir) {return fs.readdirSync(dir, (err, files) => {if (err) throw err;// console.log(`${dir}, files: `.green, files);// if (!files.length) console.log(`${dir}: 文件夹为空`.redBG);return files;})
}// 判断制定路径是否是文件
function isFile(dir) {return fs.statSync(dir).isFile();
}// 获取目录名
function getDirName(dir) {let tempdir = dir.substr(dir.lastIndexOf('\\')+1, dir.length);return tempdir;
}// const components_out = readFile(path.resolve(__dirname, './components-dir-tree.json'));
// console.log('components-dir-tree: ', components_out);// 读取指定目录的文件
function readFile(dir) {let result = fs.readFileSync(dir, 'utf-8');return (result ? {dir: dir,result: result} : null);
}module.exports = {getDirTree,readDir,isFile,readFile
}
复制代码

四、调用

  • package.json:

{..."scripts": {"gettreer": "node index.js --i","gettreer:i": "node index.js --i","gettreer:c": "node index.js --c",},...
}
复制代码
  • 函数主体

// components/index.js
// 获取目录树初始化
function getDirTreeInit() {program.version('0.0.1').option('-i --i [i]', 'ignore file or files').option('-c --c [c]', 'contain file or files').parse(process.argv);// 接受命令行参数 npm run gettreer:i ["/node_modules|.git/i"]let reg = (typeof program.i === 'string' && program.i) || (typeof program.c === 'string' && program.c)  || '[/node_modules|.git/i]';process.env.getDirTreeType = program.c ? 'c' : 'i'; // 忽略过滤ignoreprocess.env.getDirTreeReg = reg; // 正则表达式const { getDirTree, getDirName } = '' ? require('./file.js') // 上个版本: require('./file.2.js'); // 本次改进版本let treeObj = getDirTree(componentDir);// console.log('treeObj: ',treeObj);if (treeObj) {let outdir = `${__dirname}\\${getDirName(componentDir)}-dir-tree.json`;// 写入文件fs.writeFile(outdir, JSON.stringify(treeObj, '', '\t'), 'utf8', (err) => {if (err) throw err;console.log(`目录树已输出为文件保存: ${outdir}`.greenBG);});}
}
复制代码

到这里就结束了!

转载于:https://juejin.im/post/5cd3a4c851882515c110ded0

Node.js折腾记一(改进):文件夹目录树获取相关推荐

  1. bat文件打开一闪就没了_window文件夹目录树的创建

    问题描述 当我们的项目文件夹逐渐丰满,各类文件种类繁多,为了增强项目资料的自明性,便于资料管理和交接,有必要对项目文件进行汇总说明. 要进行文件汇总,首先要提取文件的目录树. 什么是目录树呢?在cmd ...

  2. 如何生成文件夹目录树文件

    小记: cd>:目标文件夹 tree /f > list.txt 效果图: 转载于:https://juejin.im/post/5c7655925188255e266aba5a

  3. python指定目录_python生成指定文件夹目录树

    # -*- coding: utf-8 -*- import sys from pathlib import Path class DirectionTree(object): "" ...

  4. Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录

    注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门Node.js(nodejs)对本地JSON文件进行增.删.改.查 ...

  5. js 删除服务器文件,Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录...

    注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门https://blog.csdn.net/qq_37860634 ...

  6. Node.js实现服务器端生成Excel文件(xls格式、xlsx格式文件)并弹出下载文件

    注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门Node.js(nodejs)对本地JSON文件进行增.删.改.查 ...

  7. node.js实现formdata上传文件

    node.js实现formdata上传文件 1.关于formdata XMLHttpRequest Level 2 添加了一个新的接口--FormData.利用 FormData 对象,我们可以通过 ...

  8. 使用Node.js express 开发上传文件/图片api接口

    我是傲夫靠斯,欢迎关注我的公众号[前端工程师的自我修养],每天更新. 今天我们来搞一个Node.js Express的上传文件功能,我使用了busboy这个库. Busboy是一个基于事件的文件流解析 ...

  9. Node.js 在本地生成日志文件

    文章目录 Node.js 在本地生成日志文件 1.前言 2.什么是 fs 3.new console.Console(stdout, stderr, ignoreErrors) 4.node.js 生 ...

最新文章

  1. 河北计算机课本初中,河北:2019-2020学年中小学教学用书有变
  2. 风格迁移应用_[风格迁移][超分][ECCV2016]Perceptual Losses for Real...
  3. 每一次突破都是一种进步
  4. kotlin 初始化数组
  5. php笔记之-laravel-Redis hash
  6. IdentityServer4客户端JWT解密实现(基于.net4.0)
  7. CSS + jQuery 实现的超 Sexy 下拉菜单
  8. 重新加载script
  9. 【爱吃肉的阿C】使用URL类将文件下载到本地
  10. 当个运营都难,二本生在如今的就业市场真的没出路了吗?
  11. Quora如何在快速开发中保持高品质代码
  12. 过孔----通孔,盲孔,埋孔
  13. VS下同一个solution下不同project之间头文件的相互调用
  14. 以计算机写一篇作文500字,描写计算机的作文
  15. BAW56-E3-08开关二极管特性
  16. python字符串与字符串抑或解析(natas11 python解法)
  17. 林大师讲区块链之信任机制
  18. PC、手机看地(DTMB)节目,支持AVS+和DRA
  19. Docker网络地址冲突问题及解决【手到病除】
  20. 秒速五厘米——我们究竟都在等待什么样的爱情

热门文章

  1. dos创建mysql数据库_用命令创建MySQL数据库
  2. mysql 字段存文件_使用数据库(mysql)字段保存文件
  3. mysql 字段值保留2位小数
  4. sql server中的注释快捷键
  5. ArrayList<object> list 转org.json.JSONArray
  6. VSCode + PYQT5 + QtDesigner
  7. vb一个使用URLDownloadToFile实现文件下载的类
  8. 【引用】别让理想毁了人生
  9. Nature:读博不该有害身体健康
  10. 刚刚,谷歌宣布TPU全面开放,AI芯片及云市场再迎变局