用Node.js遍歷多級目錄處理文件的代碼詳解
在日常開發(fā)中,處理大量的文件操作是一個常見的需求,特別是在圖像處理和存檔管理領(lǐng)域。設(shè)想一個場景:運(yùn)營團(tuán)隊(duì)需要快速處理數(shù)千張產(chǎn)品圖片,并將它們整理到公司的存儲系統(tǒng)中。然而,這些圖片通常分布在多個子文件夾中,且文件結(jié)構(gòu)復(fù)雜。如果手動完成這個過程,不僅費(fèi)時費(fèi)力,還容易出錯。因此,開發(fā)一個自動化腳本來處理這項(xiàng)任務(wù)顯得尤為重要。
需求如下:
- 遍歷文件夾及其子文件夾:腳本需要能夠遞歸遍歷指定的主目錄,檢查所有子目錄中的文件。
- 篩選圖片文件:只處理常見格式的圖片文件,如
.jpg
、.jpeg
、.png
、.gif
、.bmp
、.svg
。 - 保持目錄結(jié)構(gòu):在復(fù)制圖片文件到目標(biāo)目錄時,需保留其在原目錄中的相對路徑,以便于后續(xù)查找和管理。
- 異步處理:由于文件操作可能涉及大量 I/O 操作,腳本應(yīng)采用異步處理,以提高執(zhí)行效率和響應(yīng)速度。
- 錯誤處理:在遍歷和復(fù)制過程中,任何錯誤(如文件不可讀或目標(biāo)目錄不可寫)應(yīng)被記錄下來,避免腳本崩潰。
通過Node腳本,運(yùn)營團(tuán)隊(duì)只需提供圖片存儲的主目錄和目標(biāo)目錄,便可一鍵完成圖片的整理和歸檔,顯著提升工作效率。同時,保留目錄結(jié)構(gòu)的做法也確保了圖片管理的有序性,為后續(xù)的檢索和使用提供了便利。這種自動化工具不僅可以用于電商平臺,也適用于任何需要批量處理文件的場景,如數(shù)字資產(chǎn)管理、媒體存檔等。
主要步驟
引入模塊: 使用
fs.promises
代替fs
以便使用 Promise 風(fēng)格的異步方法。定義圖片擴(kuò)展名: 創(chuàng)建一個數(shù)組
imageExtensions
,包含常見的圖片文件擴(kuò)展名。異步遍歷文件夾的函數(shù)
traverseDirectory
:- 使用
await fs.readdir(inputDir)
讀取目錄內(nèi)容。 - 遍歷目錄中的每個文件和文件夾。
- 使用
await fs.stat(inputFilePath)
檢查每個條目的狀態(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ù)制每個圖片文件并保持目錄結(jié)構(gòu)。主函數(shù)
main
: 定義一個主函數(shù)來調(diào)用traverseDirectory
并處理回調(diào)邏輯,包括復(fù)制文件和輸出日志。執(zhí)行主函數(shù): 調(diào)用
main()
開始執(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ù)圖片操作,這里簡單拷貝 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();
使用方法
- 將上述代碼保存到一個 JavaScript 文件中,例如
copyImagesWithStructure.js
。 - 修改
inputDirectory
和outputDirectory
變量為你要遍歷的輸入目錄和目標(biāo)輸出目錄路徑。 - 在命令行中運(yùn)行
node copyImagesWithStructure.js
。
這段代碼會按順序遍歷指定輸入目錄及其子目錄中的所有圖片文件,復(fù)制到目標(biāo)目錄并保持原有的目錄結(jié)構(gòu)。
到此這篇關(guān)于用Node.js遍歷多級目錄處理文件的代碼詳解的文章就介紹到這了,更多相關(guān)Node.js遍歷處理文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js 使用 Express-Jwt和JsonWebToken 進(jìn)行Token身份
這篇文章主要介紹了Node.js 使用 Express-Jwt和JsonWebToken 進(jìn)行Token身份驗(yàn)證的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08nodejs+mysql實(shí)現(xiàn)用戶相關(guān)的增刪改查的詳細(xì)操作
這篇文章主要介紹了nodejs+mysql實(shí)現(xiàn)用戶相關(guān)的增刪改查的詳細(xì)操作的相關(guān)資料,需要的朋友可以參考下2023-05-05Nodejs實(shí)現(xiàn)內(nèi)網(wǎng)穿透服務(wù)
很多人都不知道什么是內(nèi)網(wǎng)穿透,就是公網(wǎng)客戶端,可以訪問局域網(wǎng)內(nèi)的服務(wù),本文詳細(xì)的介紹了原理以及實(shí)現(xiàn),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Node.js中Process.nextTick()和Process.setImmediate()的區(qū)別
這篇文章介紹了Node.js中Process.nextTick()和Process.setImmediate()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07NodeJS、NPM安裝配置步驟(windows版本) 以及環(huán)境變量詳解
本篇文章主要介紹了NodeJS、NPM安裝配置步驟(windows版本) 以及環(huán)境變量詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Windows安裝Node.js報錯:2503、2502的解決方法
這篇文章主要給大家介紹了關(guān)于在Windows系統(tǒng)下安裝Node.js報錯:2503、2502的解決方法,文中將解決的方法一步步介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10node.js操作mongoDB數(shù)據(jù)庫示例分享
這里給大家分享的是node.js操作mongoDB數(shù)據(jù)庫的示例,包括連接數(shù)據(jù)庫、插入數(shù)據(jù)、關(guān)閉數(shù)據(jù)庫、讀取數(shù)據(jù)、插入數(shù)據(jù)等方面,十分的全面,這里推薦給需要的小伙伴們。2014-11-11Node.js中Bootstrap-table的兩種分頁的實(shí)現(xiàn)方法
這篇文章主要介紹了Node.js中Bootstrap-table的兩種分頁的使用方法,需要的朋友可以參考下2017-09-09node.js中事件觸發(fā)器events的使用方法實(shí)例分析
這篇文章主要介紹了node.js中事件觸發(fā)器events的使用方法,結(jié)合實(shí)例形式分析了node.js事件觸發(fā)器events的功能、原理及基本使用方法,需要的朋友可以參考下2019-11-11