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 相关文章推荐
addRule在firefox下的兼容写法
Nov 30 Javascript
javascript中定义类的方法汇总
Dec 28 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
JS iFrame加载慢怎么解决
May 13 Javascript
浅析JavaScript中的特殊数据类型
Dec 15 Javascript
详解ES6通过WeakMap解决内存泄漏问题
Mar 09 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
Oct 28 Javascript
vue服务端渲染操作简单入门实例分析
Aug 28 Javascript
详解webpack-dev-middleware 源码解读
Mar 23 Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 Javascript
如何理解Vue简单状态管理之store模式
May 15 Vue.js
如何通过简单的代码描述Angular父组件、子组件传值
Apr 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学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
获取body标签的两种方法
2011/10/13 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
jquery 遍历数组 each 方法详解
2016/05/25 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
python如何获取服务器硬件信息
2017/05/11 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
python自动发送邮件脚本
2018/06/20 Python
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
上海微创软件面试题
2012/06/14 面试题
临床医学应届生求职信
2013/11/06 职场文书
小学开学寄语
2014/01/19 职场文书
珍惜水资源建议书
2014/03/12 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
岗位职责说明书模板
2014/07/30 职场文书
机动车登记业务委托书
2014/10/08 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
Java 数组内置函数toArray详解
2021/06/28 Java/Android