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使用技巧精萃[代码非常实用]
Nov 21 Javascript
一些相见恨晚的 JavaScript 技巧
Apr 25 Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
Oct 29 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
Sep 09 Javascript
jquery+json实现数据二级联动的方法
Nov 28 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
jquery实现左右轮播切换效果
Jan 01 jQuery
微信小程序仿今日头条导航栏滚动解析
Aug 20 Javascript
基于JavaScript实现简单抽奖功能代码实例
Oct 20 Javascript
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
优雅地使用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操作MongoDB的技术总结
2013/06/02 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
javascript列表框操作函数集合汇总
2013/11/28 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
TensorFlow变量管理详解
2018/03/10 Python
python中使用print输出中文的方法
2018/07/16 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
python的debug实用工具 pdb详解
2019/07/12 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
Django 路由层URLconf的实现
2019/12/30 Python
500行python代码实现飞机大战
2020/04/24 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
管道维修工岗位职责
2013/12/27 职场文书
家长会标语
2014/06/24 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
财务检查整改报告
2014/11/06 职场文书
人事任命通知
2015/04/20 职场文书
公司年会开场白
2015/06/01 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
Redis入门教程详解
2021/08/30 Redis