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/n/325572.html
微信扫一扫
支付宝扫一扫