用Node.js遍历多级目录处理文件的代码详解

 更新时间:2024年06月18日 11:48:16   作者:Demon_Laplace  
在日常开发中,处理大量的文件操作是一个常见的需求,特别是在图像处理和存档管理领域,本文给大家介绍了如何用Node.js遍历多级目录处理文件,文章给出了主要步骤和完整代码,需要的朋友可以参考下

在日常开发中,处理大量的文件操作是一个常见的需求,特别是在图像处理和存档管理领域。设想一个场景:运营团队需要快速处理数千张产品图片,并将它们整理到公司的存储系统中。然而,这些图片通常分布在多个子文件夹中,且文件结构复杂。如果手动完成这个过程,不仅费时费力,还容易出错。因此,开发一个自动化脚本来处理这项任务显得尤为重要。

需求如下:

  • 遍历文件夹及其子文件夹:脚本需要能够递归遍历指定的主目录,检查所有子目录中的文件。
  • 筛选图片文件:只处理常见格式的图片文件,如 .jpg.jpeg.png.gif.bmp.svg
  • 保持目录结构:在复制图片文件到目标目录时,需保留其在原目录中的相对路径,以便于后续查找和管理。
  • 异步处理:由于文件操作可能涉及大量 I/O 操作,脚本应采用异步处理,以提高执行效率和响应速度。
  • 错误处理:在遍历和复制过程中,任何错误(如文件不可读或目标目录不可写)应被记录下来,避免脚本崩溃。

通过Node脚本,运营团队只需提供图片存储的主目录和目标目录,便可一键完成图片的整理和归档,显著提升工作效率。同时,保留目录结构的做法也确保了图片管理的有序性,为后续的检索和使用提供了便利。这种自动化工具不仅可以用于电商平台,也适用于任何需要批量处理文件的场景,如数字资产管理、媒体存档等。

主要步骤

  • 引入模块: 使用 fs.promises 代替 fs 以便使用 Promise 风格的异步方法。

  • 定义图片扩展名: 创建一个数组 imageExtensions,包含常见的图片文件扩展名。

  • 异步遍历文件夹的函数 traverseDirectory:

    • 使用 await fs.readdir(inputDir) 读取目录内容。
    • 遍历目录中的每个文件和文件夹。
    • 使用 await fs.stat(inputFilePath) 检查每个条目的状态(文件还是文件夹)。
    • 如果是文件夹,递归调用 await traverseDirectory(inputFilePath, newOutputDir, callback),并确保目标目录存在。
    • 如果是文件,检查扩展名是否在 imageExtensions 数组中,如果是则调用 await callback(inputFilePath, outputFilePath)
  • 使用示例: 定义输入和输出目录,并调用 traverseDirectory,在回调函数中复制每个图片文件并保持目录结构。

  • 主函数 main: 定义一个主函数来调用 traverseDirectory 并处理回调逻辑,包括复制文件和输出日志。

  • 执行主函数: 调用 main() 开始执行。

完整代码

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

// 定义支持的图片扩展名
const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'];

// 遍历文件夹的异步函数
async function traverseDirectory(inputDir, outputDir, callback) {
  try {
    const files = await fs.readdir(inputDir);
    
    for (const file of files) {
      const inputFilePath = path.join(inputDir, file);
      const stats = await fs.stat(inputFilePath);

      if (stats.isDirectory()) {
        // 如果是文件夹,递归遍历
        const newOutputDir = path.join(outputDir, file);
        await fs.mkdir(newOutputDir, { recursive: true });
        await traverseDirectory(inputFilePath, newOutputDir, callback);
      } else if (stats.isFile()) {
        // 如果是文件,检查是否是图片
        const ext = path.extname(file).toLowerCase();
        if (imageExtensions.includes(ext)) {
          const outputFilePath = path.join(outputDir, file);
          await callback(inputFilePath, outputFilePath);
        }
      }
    }
  } catch (err) {
    console.error(`Error processing directory ${inputDir}:`, err);
  }
}

// 使用示例
const inputDirectory = '/path/to/your/input/directory'; // 修改为你的输入文件夹路径
const outputDirectory = '/path/to/your/output/directory'; // 修改为你的输出文件夹路径

// 主函数,处理文件遍历和复制
async function main() {
  await traverseDirectory(inputDirectory, outputDirectory, async (inputFilePath, outputFilePath) => {
    // 替换成真实业务图片操作,这里简单拷贝
    try {
      await fs.copyFile(inputFilePath, outputFilePath);
      console.log(`Copied ${inputFilePath} to ${outputFilePath}`);
    } catch (err) {
      console.error(`Error copying ${inputFilePath} to ${outputFilePath}:`, err);
    }
  });
}

// 执行主函数
main();

使用方法

  • 将上述代码保存到一个 JavaScript 文件中,例如 copyImagesWithStructure.js
  • 修改 inputDirectoryoutputDirectory 变量为你要遍历的输入目录和目标输出目录路径。
  • 在命令行中运行 node copyImagesWithStructure.js

这段代码会按顺序遍历指定输入目录及其子目录中的所有图片文件,复制到目标目录并保持原有的目录结构。

到此这篇关于用Node.js遍历多级目录处理文件的代码详解的文章就介绍到这了,更多相关Node.js遍历处理文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你如何使用node.js制作代理服务器

    教你如何使用node.js制作代理服务器

    本文介绍了如何使用node.js制作代理服务器,图文并茂,十分的详细,代码很简洁易懂,这里推荐给大家。
    2014-11-11
  • 基于socket.io+express实现多房间聊天

    基于socket.io+express实现多房间聊天

    本文给大家分享的是使用node.js,基于socket.io+express实现多房间聊天的代码,非常的实用,有需要的小伙伴可以来参考下
    2016-03-03
  • 在Node.js应用程序中处理大数的操作指南

    在Node.js应用程序中处理大数的操作指南

    在JavaScript生态系统中,你可以使用BigInt来处理大整数,但是,你也可以使用具有类似于BigInt功能的第三方库,本文将是使用BigInt和提供类似功能的流行库管理大数的完整指南,我们还将比较第三方库的用例、优势和劣势
    2023-06-06
  • 使用node-media-server搭建一个简易的流媒体服务器

    使用node-media-server搭建一个简易的流媒体服务器

    这篇文章主要介绍了使用node-media-server搭建一个简易的流媒体服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • PHPStorm中如何对nodejs项目进行单元测试详解

    PHPStorm中如何对nodejs项目进行单元测试详解

    这篇文章主要给大家介绍了关于PHPStorm中如何对nodejs项目进行单元测试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • gulp加批处理(.bat)实现ng多应用一键自动化构建

    gulp加批处理(.bat)实现ng多应用一键自动化构建

    这篇文章主要给大家介绍了利用gulp加上批处理(.bat)实现ng多应用一键自动化构建的相关资料,文中介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • node.js 抓取代理ip实例代码

    node.js 抓取代理ip实例代码

    这篇文章主要介绍了node.js 抓取代理ip实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • Node.js实现WebSocket实时通信的具体方案

    Node.js实现WebSocket实时通信的具体方案

    在传统 Web 应用中,客户端与服务器之间通常通过 HTTP 进行通信,但 HTTP 的请求—响应模型并不适合实时场景,WebSocket 的出现,解决了浏览器与服务器之间实时、双向通信的问题,本文将结合 Node.js,系统讲解 WebSocket 的工作原理与实战应用,需要的朋友可以参考下
    2025-12-12
  • nest.js,egg.js,midway,express,koa的区别小结

    nest.js,egg.js,midway,express,koa的区别小结

    本文主要介绍了nest.js,egg.js,midway,express,koa的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Node.js批量给图片加水印的方法

    Node.js批量给图片加水印的方法

    这篇文章主要介绍了Node.js批量给图片加水印的方法,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下
    2016-11-11

最新评论