Node.js中的文件系統模塊(fs模塊)提供了許多API用於處理文件和目錄。其中,fs.readdirSync()函數是Node.js中最常用的文件和文件夾處理函數之一。fs.readdirSync()方法用於同步讀取指定目錄中的所有文件名或文件夾名,返回一個包含所有文件名和文件夾名的數組。
一、讀取指定目錄函數
fs.readdirSync()函數接收兩個參數
fs.readdirSync(path[, options])
path參數為要讀取的目錄路徑,可以是絕對路徑或相對路徑。options參數為一個對象,可以省略。該對象的屬性有:
- encoding : 返迴文件名的編碼格式,默認為 'utf8' - withFileTypes : 是否處理文件夾和文件類型,默認為false
下面我們以讀取’/home/user/documents/’目錄下的所有文件為例,進行示範。
const fs = require('fs') const path = '/home/user/documents/' try { const fileNames = fs.readdirSync(path) console.log(fileNames) } catch (err) { console.log(err) }
輸出結果如下:
[ 'file1.txt', 'file2.md', 'folder1', 'folder2' ]
為了方便起見,代碼中使用try-catch語句捕捉了錯誤。如果目錄不存在或讀取失敗,程序將拋出錯誤。
二、讀取指定文件夾下的所有文件
使用fs.readdirSync()函數讀取指定目錄下的所有文件,需要遍歷目錄中所有的文件和文件夾,並將每個文件和文件夾名存儲到一個數組中。
下面我們以讀取’/home/user/documents/folder1/’文件夾下的所有文件為例,進行示範。
const fs = require('fs') const path = '/home/user/documents/folder1/' try { const fileNames = fs.readdirSync(path) const files = fileNames.map((file) => path + file) console.log(files) } catch (err) { console.log(err) }
輸出結果如下:
[ '/home/user/documents/folder1/file1.txt', '/home/user/documents/folder1/file2.jpeg', '/home/user/documents/folder1/file3.md' ]
使用map()函數的主要目的是將文件名的數組轉化為文件路徑的數組,因為fs模塊的讀取函數需要使用完整的文件路徑。
三、讀取指定文件夾下的所有子文件夾
使用fs.readdirSync()函數讀取指定目錄下的所有子文件夾,同樣需要遍歷目錄中所有的文件和文件夾,並將每個子文件夾名存儲到一個數組中。
下面我們以讀取’/home/user/documents/folder1/’文件夾下的所有子文件夾為例,進行示範。
const fs = require('fs') const path = '/home/user/documents/folder1/' try { const fileNames = fs.readdirSync(path, {withFileTypes: true}) const dirs = fileNames.filter((dirent) => dirent.isDirectory()) .map((dirent) => path + dirent.name) console.log(dirs) } catch (err) { console.log(err) }
輸出結果如下:
[ '/home/user/documents/folder1/subfolder1', '/home/user/documents/folder1/subfolder2' ]
首先在fs.readdirSync()函數中加入{withFileTypes: true}作為options參數,這樣返回的數組不僅包含文件或文件夾的名字,還指示fs模塊返回一個Dirent對象來處理文件和目錄。使用map()函數將每個子文件夾的name屬性添加到該數組中。
四、同步遍歷文件夾
使用fs.readdirSync()函數可以遍歷目錄下的所有文件和文件夾,但是當文件夾的層數較深時,代碼會變得非常複雜。建議使用遞歸函數來實現同步遍歷。
const fs = require('fs') const path = '/home/user/documents/' function traverseDir(path) { const fileNames = fs.readdirSync(path, {withFileTypes: true}) const files = [] const dirs = [] fileNames.forEach((dirent) => { const fullPath = path + dirent.name if(dirent.isDirectory()) { dirs.push(fullPath) const childFiles = traverseDir(fullPath + '/') files.push(...childFiles) } else { files.push(fullPath) } }) return files } try { const files = traverseDir(path) console.log(files) } catch (err) { console.log(err) }
輸出結果為該目錄下所有文件的路徑數組。
在traverseDir()函數中,首先使用fs.readdirSync()讀取指定目錄下的所有文件和文件夾名字,並根據類型分別存儲到文件數組和文件夾數組中。然後,遍歷文件夾數組,對於每一個文件夾遞歸調用traverseDir()函數,並將返回的文件數組添加到總文件數組中。最後,將文件數組返回。
五、總結
fs.readdirSync()函數是Node.js中最常用的文件系統模塊之一。它能夠同步讀取指定目錄下的所有文件和文件夾名字,可以用於遍歷目錄,實現一些文件操作,如複製、刪除等。但是需要注意,在同步模式中,該函數會阻塞JavaScript進程的執行,因此在處理大量文件或文件夾時,可能會耗費大量時間。因此,如果需要處理大量的文件或文件夾,建議使用異步的方式進行操作。
原創文章,作者:XDGRY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/325572.html