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 打开页面window.location和window.open的区别
Mar 17 Javascript
浅析JavaScript中的同名标识符优先级
Dec 06 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
深入理解JQuery中的事件与动画
May 18 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
Three.js快速入门教程
Sep 09 Javascript
Angularjs中controller的三种写法分享
Sep 21 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
vue中遇到的坑之变化检测问题(数组相关)
Oct 13 Javascript
layer实现弹出层自动调节位置
Sep 05 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
Sep 24 Javascript
vue路由权限校验功能的实现代码
Jun 07 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小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
ThinkPHP应用模式扩展详解
2014/07/16 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
React简单介绍
2017/05/24 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
Python API自动化框架总结
2019/11/12 Python
python计算二维矩形IOU实例
2020/01/18 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
寒假实习自荐信
2014/01/26 职场文书
项目采购员岗位职责
2014/04/15 职场文书
感谢信范文大全
2015/01/23 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang