用Node.js遍歷多級(jí)目錄處理文件的代碼詳解
在日常開(kāi)發(fā)中,處理大量的文件操作是一個(gè)常見(jiàn)的需求,特別是在圖像處理和存檔管理領(lǐng)域。設(shè)想一個(gè)場(chǎng)景:運(yùn)營(yíng)團(tuán)隊(duì)需要快速處理數(shù)千張產(chǎn)品圖片,并將它們整理到公司的存儲(chǔ)系統(tǒng)中。然而,這些圖片通常分布在多個(gè)子文件夾中,且文件結(jié)構(gòu)復(fù)雜。如果手動(dòng)完成這個(gè)過(guò)程,不僅費(fèi)時(shí)費(fèi)力,還容易出錯(cuò)。因此,開(kāi)發(fā)一個(gè)自動(dòng)化腳本來(lái)處理這項(xiàng)任務(wù)顯得尤為重要。
需求如下:
- 遍歷文件夾及其子文件夾:腳本需要能夠遞歸遍歷指定的主目錄,檢查所有子目錄中的文件。
- 篩選圖片文件:只處理常見(jiàn)格式的圖片文件,如
.jpg、.jpeg、.png、.gif、.bmp、.svg。 - 保持目錄結(jié)構(gòu):在復(fù)制圖片文件到目標(biāo)目錄時(shí),需保留其在原目錄中的相對(duì)路徑,以便于后續(xù)查找和管理。
- 異步處理:由于文件操作可能涉及大量 I/O 操作,腳本應(yīng)采用異步處理,以提高執(zhí)行效率和響應(yīng)速度。
- 錯(cuò)誤處理:在遍歷和復(fù)制過(guò)程中,任何錯(cuò)誤(如文件不可讀或目標(biāo)目錄不可寫(xiě))應(yīng)被記錄下來(lái),避免腳本崩潰。
通過(guò)Node腳本,運(yùn)營(yíng)團(tuán)隊(duì)只需提供圖片存儲(chǔ)的主目錄和目標(biāo)目錄,便可一鍵完成圖片的整理和歸檔,顯著提升工作效率。同時(shí),保留目錄結(jié)構(gòu)的做法也確保了圖片管理的有序性,為后續(xù)的檢索和使用提供了便利。這種自動(dòng)化工具不僅可以用于電商平臺(tái),也適用于任何需要批量處理文件的場(chǎng)景,如數(shù)字資產(chǎn)管理、媒體存檔等。
主要步驟
引入模塊: 使用
fs.promises代替fs以便使用 Promise 風(fēng)格的異步方法。定義圖片擴(kuò)展名: 創(chuàng)建一個(gè)數(shù)組
imageExtensions,包含常見(jiàn)的圖片文件擴(kuò)展名。異步遍歷文件夾的函數(shù)
traverseDirectory:- 使用
await fs.readdir(inputDir)讀取目錄內(nèi)容。 - 遍歷目錄中的每個(gè)文件和文件夾。
- 使用
await fs.stat(inputFilePath)檢查每個(gè)條目的狀態(tài)(文件還是文件夾)。 - 如果是文件夾,遞歸調(diào)用
await traverseDirectory(inputFilePath, newOutputDir, callback),并確保目標(biāo)目錄存在。 - 如果是文件,檢查擴(kuò)展名是否在
imageExtensions數(shù)組中,如果是則調(diào)用await callback(inputFilePath, outputFilePath)。
- 使用
使用示例: 定義輸入和輸出目錄,并調(diào)用
traverseDirectory,在回調(diào)函數(shù)中復(fù)制每個(gè)圖片文件并保持目錄結(jié)構(gòu)。主函數(shù)
main: 定義一個(gè)主函數(shù)來(lái)調(diào)用traverseDirectory并處理回調(diào)邏輯,包括復(fù)制文件和輸出日志。執(zhí)行主函數(shù): 調(diào)用
main()開(kāi)始執(zhí)行。
完整代碼
const fs = require('fs').promises;
const path = require('path');
// 定義支持的圖片擴(kuò)展名
const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'];
// 遍歷文件夾的異步函數(shù)
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'; // 修改為你的輸出文件夾路徑
// 主函數(shù),處理文件遍歷和復(fù)制
async function main() {
await traverseDirectory(inputDirectory, outputDirectory, async (inputFilePath, outputFilePath) => {
// 替換成真實(shí)業(yè)務(wù)圖片操作,這里簡(jiǎn)單拷貝
try {
await fs.copyFile(inputFilePath, outputFilePath);
console.log(`Copied ${inputFilePath} to ${outputFilePath}`);
} catch (err) {
console.error(`Error copying ${inputFilePath} to ${outputFilePath}:`, err);
}
});
}
// 執(zhí)行主函數(shù)
main();
使用方法
- 將上述代碼保存到一個(gè) JavaScript 文件中,例如
copyImagesWithStructure.js。 - 修改
inputDirectory和outputDirectory變量為你要遍歷的輸入目錄和目標(biāo)輸出目錄路徑。 - 在命令行中運(yùn)行
node copyImagesWithStructure.js。
這段代碼會(huì)按順序遍歷指定輸入目錄及其子目錄中的所有圖片文件,復(fù)制到目標(biāo)目錄并保持原有的目錄結(jié)構(gòu)。
到此這篇關(guān)于用Node.js遍歷多級(jí)目錄處理文件的代碼詳解的文章就介紹到這了,更多相關(guān)Node.js遍歷處理文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于socket.io+express實(shí)現(xiàn)多房間聊天
本文給大家分享的是使用node.js,基于socket.io+express實(shí)現(xiàn)多房間聊天的代碼,非常的實(shí)用,有需要的小伙伴可以來(lái)參考下2016-03-03
在Node.js應(yīng)用程序中處理大數(shù)的操作指南
在JavaScript生態(tài)系統(tǒng)中,你可以使用BigInt來(lái)處理大整數(shù),但是,你也可以使用具有類(lèi)似于BigInt功能的第三方庫(kù),本文將是使用BigInt和提供類(lèi)似功能的流行庫(kù)管理大數(shù)的完整指南,我們還將比較第三方庫(kù)的用例、優(yōu)勢(shì)和劣勢(shì)2023-06-06
使用node-media-server搭建一個(gè)簡(jiǎn)易的流媒體服務(wù)器
這篇文章主要介紹了使用node-media-server搭建一個(gè)簡(jiǎn)易的流媒體服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
PHPStorm中如何對(duì)nodejs項(xiàng)目進(jìn)行單元測(cè)試詳解
這篇文章主要給大家介紹了關(guān)于PHPStorm中如何對(duì)nodejs項(xiàng)目進(jìn)行單元測(cè)試的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
gulp加批處理(.bat)實(shí)現(xiàn)ng多應(yīng)用一鍵自動(dòng)化構(gòu)建
這篇文章主要給大家介紹了利用gulp加上批處理(.bat)實(shí)現(xiàn)ng多應(yīng)用一鍵自動(dòng)化構(gòu)建的相關(guān)資料,文中介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02
Node.js實(shí)現(xiàn)WebSocket實(shí)時(shí)通信的具體方案
在傳統(tǒng) Web 應(yīng)用中,客戶端與服務(wù)器之間通常通過(guò) HTTP 進(jìn)行通信,但 HTTP 的請(qǐng)求—響應(yīng)模型并不適合實(shí)時(shí)場(chǎng)景,WebSocket 的出現(xiàn),解決了瀏覽器與服務(wù)器之間實(shí)時(shí)、雙向通信的問(wèn)題,本文將結(jié)合 Node.js,系統(tǒng)講解 WebSocket 的工作原理與實(shí)戰(zhàn)應(yīng)用,需要的朋友可以參考下2025-12-12
nest.js,egg.js,midway,express,koa的區(qū)別小結(jié)
本文主要介紹了nest.js,egg.js,midway,express,koa的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

