Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解


Posted in Javascript onApril 20, 2019

前言

用来干什么:想干嘛干嘛
为什么写:写来玩,学习node.js文件系统相关api;树结构这种东西还是挺不错的,会用会造才是真的会
用了什么: fs.readdir(dir), fs.stat(dir).isFile(), path处理路径等

思路:

  1. 读取当前文件夹(不是文件夹的另作处理),获得其下所有文件和目录组成的数组;
  2. 循环该数组,判断是文件夹还是文件,文件的话直接push到childFiles(对象有两个属性:short文件名,full完整文件路径)
  3. 文件夹的话,先把当前文件夹作为key,存到父级文件夹的childDir属性下,然后自调用传当前文件夹路径
  4. 每一层文件夹都包含三个属性:dir文件夹路径,childFiles子文件,childDir子文件夹,存储为对象结构
  5. 以上步骤重复,直到达到最底层空文件夹或该文件夹只有文件

输出的样子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)

...
|-- components
    -- index.js
    -- file.js
    -- components-dir-tree.json  // 生成的文件树对象的输出文件,方便查看
    -- no
    -- test
       -- aa
        -- cc

使用

将输出结果格式化写入到json文件,看起来一目了然

components/index.js:
/**
 * init
 */
require('console-color-mr'); // 命令行样式
const fs = require('fs');
const path = require('path');
const { getDirTree, getDirName } = require('./file.js');

const componentDir = path.resolve(__dirname, './');
// console.log('componentDir: ', componentDir);

const ComponentInit = (function init() {
 console.log('______ init ______'.blueBG, '\n');
 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);
  });
 }
 return init;
})();

module.exports = ComponentInit;

主函数 getDirTree:

/components/file.js
const fs = require('fs');

/**
 * 获取目录下的文件树
 * @param {读取的路径} dir
 * @returns 返回 dir 目录下的文件树
 */
function getDirTree(dir) {
 let obj = {
  dir: dir, // 文件夹路径
  childFiles: [], // 子文件
  childDir: {} // 子目录
 };
 let objStr = JSON.stringify(obj);
 if (isFile(dir)) return console.log(`${dir}: 不是文件夹`.redBG);
 
 // 读取目录
 let files = readDir(dir);
 if (!files.length) console.log(`${dir}: 文件夹为空`.redBG);
 
 // 遍历文件
 files.forEach(file => {
  let tempdir = `${dir}\\${file}`;
  if (isFile(tempdir)) {
   obj.childFiles.push({
    short: file, // 文件名
    full: tempdir // 完整路径
   });
   
  } else {
   // console.log('tempdir: ',tempdir);
   let dirname = getDirName(tempdir);
   // 在当前文件夹的对象下 childDir 属性(1),以文件夹名作为key(2),
   // (2)的值是该目录下 路径dir、childFiles子文件、childDir子文件夹组成的对象或null
   obj.childDir[dirname] = getDirTree(tempdir);
  }
 });
 return JSON.stringify(obj) === objStr ? null : obj;
}

工具函数 readDir/isFile

// 读取路径下的文件、文件夹
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
}

完结,撒花,撒花!

以上所述是小编给大家介绍的Node.js读指定文件夹输出该文件夹文件树详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
NiftyCube——轻松实现圆角边框
Feb 20 Javascript
js通过元素class名字获取元素集合的具体实现
Jan 06 Javascript
文本域光标操作的jQuery扩展分享
Mar 10 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
jQuery手机拨号界面特效代码分享
Aug 27 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
May 22 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
Jan 16 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
javascript实现日历效果
Jun 17 Javascript
解决Layui中templet中a的onclick参数传递的问题
Sep 20 Javascript
js实现点击生成随机div
Jan 16 Javascript
Vue+Vant 图片上传加显示的案例
Nov 03 Javascript
优雅地使用loading(推荐)
Apr 20 #Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 #Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 #Javascript
函数式编程入门实践(一)
Apr 20 #Javascript
vue路由对不同界面进行传参及跳转的总结
Apr 20 #Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Apr 20 #Javascript
详解vue使用$http服务端收不到参数
Apr 19 #Javascript
You might like
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
Laravel 5 学习笔记
2015/03/06 PHP
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
python生成随机验证码(中文验证码)示例
2014/04/03 Python
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
浅析Python四种数据类型
2018/09/26 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
详解Anaconda 的安装教程
2020/09/23 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
行政经理岗位职责
2013/11/09 职场文书
同居协议书范本
2014/04/23 职场文书
质量管理标语
2014/06/12 职场文书
承诺书样本
2014/08/30 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
好人好事新闻稿
2015/07/17 职场文书
大学开学感言
2015/08/01 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
Python中的socket网络模块介绍
2022/07/23 Python