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 相关文章推荐
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
Oct 20 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
Jul 11 Javascript
javascript 实现字符串反转的三种方法
Nov 23 Javascript
JQuery中extend的用法实例分析
Feb 08 Javascript
基于jQuery实现网页进度显示插件
Mar 04 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
Apr 06 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
Dec 25 Javascript
原生JS实现图片轮播切换效果
Dec 15 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 Javascript
js中getter和setter用法实例分析
Aug 14 Javascript
浅谈layui分页控件field参数接收对象的问题
Sep 20 Javascript
vue 获取及修改store.js里的公共变量实例
Nov 06 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 google或baidu分页代码
2009/11/26 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
php实现简单加入购物车功能
2017/03/07 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
2019/08/08 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
索桥的故事教学反思
2014/02/06 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
小学班主任寄语大全
2014/04/04 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
Python办公自动化之Excel(中)
2021/05/24 Python
python调试工具Birdseye的使用教程
2021/05/25 Python