天天看点

web前端【实战案例】Node.js 运用递归遍历目录树生成JSON

作者:PrvtSite

在程序开发过程中,有时候需要对一个目录下的文件进行批量操作。如果我们手动去一个个查找、处理,那么效率极低,还容易出错。因此,我们可以使用node.js,来实现一个遍历指定目录下所有文件并生成json的脚本。

web前端【实战案例】Node.js 运用递归遍历目录树生成JSON

什么是node.js

node.js是一种流行的后端JavaScript运行时环境,基于Chrome V8引擎构建。它使得JavaScript代码能够在服务器上被执行,同时还支持网络编程协议,并提供了丰富的库和工具链,方便开发人员快速构建高性能、可扩展的应用程序。

遍历指定目录下所有文件

我们将使用node.js,实现一个递归遍历指定目录下所有文件的方法。假设我们要遍历的目录名为dir,那么我们可以采用以下步骤:

1、使用fs.readdirSync(dir)方法读取目录中的所有文件和子目录;

2、对每个文件和子目录进行判断:

* 如果是目录,则递归调用本方法;

* 如果是文件,则记录其路径并添加到一个数组中。

示例代码:

const fs = require('fs');
const path = require('path');

function traverseDir(dir) {
  const result = [];
  const files = fs.readdirSync(dir);
  for (const file of files) {
    const filePath = path.join(dir, file);
    if (fs.statSync(filePath).isDirectory()) {
      // 如果是目录,则递归调用本方法
      result.push(...traverseDir(filePath));
    } else {
      // 如果是文件,则记录其路径
      result.push(filePath);
    }
  }
  return result;
}

const files = traverseDir('./dir');
console.log(files);
           

生成JSON

有了遍历指定目录下所有文件的方法,我们接下来,可以将这些文件名组成的数组,转化为一个JSON对象。假设我们要生成的json文件名为 result.json ,那么我们可以按照以下步骤进行操作:

1、初始化一个空数组;

2、遍历处理得到的所有文件名,并使用path.parse()方法获取每个文件的基本信息;

3、将每个文件的基本信息包装成一个对象并添加到数组中;

4、将这个数组写入到result.json文件中。

示例代码:

const fs = require('fs');
const path = require('path');

function traverseDir(dir) {
  const result = [];
  const files = fs.readdirSync(dir);
  for (const file of files) {
    const filePath = path.join(dir, file);
    if (fs.statSync(filePath).isDirectory()) {
      result.push(...traverseDir(filePath));
    } else {
      result.push({
        filename: path.basename(filePath),
        extname: path.extname(filePath),
        path: filePath,
      });
    }
  }
  return result;
}

const files = traverseDir('./dir');
fs.writeFileSync('result.json', JSON.stringify(files, null, 2));           

生成树形结构JSON

如果您需要一个树形结构的数据格式,我们稍加改动上面的示例代码即可。

示例代码:

const fs = require("fs");
const path = require("path");

// 遍历指定目录下的所有文件,并将信息保存到JSON对象中
function traverseDirToTree(dir) {
  const result = [];
  const files = fs.readdirSync(dir);

  for (const file of files) {
    const filePath = path.join(dir, file);
    const stat = fs.statSync(filePath);

    // 如果是文件夹,递归遍历
    if (stat.isDirectory()) {
      result.push({
        name: file,
        type: "directory",
        children: traverseDirToTree(filePath),
      });
    } else {
      result.push({
        name: file,
        type: "file",
        size: stat.size,
        modified: stat.mtime,
      });
    }
  }

  return result;
}

const files = traverseDirToTree("./dir");
fs.writeFileSync("result.json", JSON.stringify(files, null, 2));           

希望本文能够对您有所帮助,感谢您的阅读!

人人为我,我为人人,谢谢您的浏览,我们一起加油吧。