用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
。 - 修改
inputDirectory
和outputDirectory
变量为你要遍历的输入目录和目标输出目录路径。 - 在命令行中运行
node copyImagesWithStructure.js
。
这段代码会按顺序遍历指定输入目录及其子目录中的所有图片文件,复制到目标目录并保持原有的目录结构。
到此这篇关于用Node.js遍历多级目录处理文件的代码详解的文章就介绍到这了,更多相关Node.js遍历处理文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
better sqlite3安装node gyp原生模块编译prebuild-install
这篇文章主要为大家介绍了Nodejs关于原生模块编译node-gyp + prebuild-install (以安装 better-sqlite3为例)详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-11-11
最新评论