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