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 相关文章推荐
Js获取事件对象代码
Aug 05 Javascript
网页中返回顶部代码(多种方法)另附注释说明
Apr 24 Javascript
jQuery焦点图切换特效插件封装实例
Aug 18 Javascript
Javascript中克隆一个数组的实现代码
Dec 06 Javascript
jquery 鼠标滑动显示详情应用示例
Jan 24 Javascript
js返回上一页并刷新的多种实现方法
Feb 26 Javascript
jQuery获取标签文本内容和html内容的方法
Mar 27 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
Sep 07 Javascript
js倒计时显示实例
Dec 11 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 Javascript
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
Nov 06 Javascript
Node.js使用supervisor进行开发中调试的方法
Mar 26 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 文件状态缓存带来的问题
2008/12/14 PHP
php实现无限级分类实现代码(递归方法)
2011/01/01 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
php实现加减法验证码代码
2014/02/14 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
jquery中获取id值方法小结
2013/09/22 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
python游戏地图最短路径求解
2019/01/16 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
jupyter notebook清除输出方式
2020/04/10 Python
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
办公室文秘自我评价
2013/09/21 职场文书
外语系毕业生找工作的求职信
2013/11/28 职场文书
预备党员思想汇报范文
2013/12/29 职场文书
监理资料员岗位职责
2014/01/03 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
奖学金感谢信
2015/01/21 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
现实表现证明材料
2015/06/19 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书