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-hk/n/325572.html
微信掃一掃
支付寶掃一掃