💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[success] # 读取文件目录和文件 1. 可以**读取指定目录下的子目录或者文件** | 方法名 | 描述 | | --- | --- | | `fs.readdir(path[, options], callback)` | 异步读取目录中的文件和子目录 | | `fs.readdirSync(path[, options])` | 同步读取目录中的文件和子目录名称 | | `fs.promises.readdir(path[, options])` | 返回一个Promise对象,异步读取目录中的文件和子目录名称 | >[danger] ### fs.readdir(path[, options], callback) 1. `fs.readdir(path[, options], callback)`是Node.js中用于读取目录中的所有文件和子目录的异步方法。该方法接受三个参数: * `path`:要读取的目录的路径。 * `options`:可选参数,用于指定读取目录时的选项,如`encoding`、`withFileTypes`等。 * `callback`:回调函数,当目录读取完成时调用。 回调函数有两个参数: * `err`:如果发生错误,则为错误对象;否则为`null`。 * `files`:一个包含目录中所有文件和子目录的名称的数组。 2. `withFileTypes`是`fs.readdir()`方法的一个可选参数,它指定返回的文件名数组中是否包含文件的类型信息。 当`withFileTypes`设置为`true`时,返回的数组中将包含一个`fs.Dirent`对象数组,该对象包含文件名、文件类型以及其他文件信息。`fs.Dirent`对象有两个属性:`name`和`isDirectory()`。`name`属性是文件或目录的名称,`isDirectory()`方法返回一个布尔值,表示该文件是否是一个目录。 当`withFileTypes`设置为`false`或未指定时,返回的数组中只包含文件名字符串数组。 >[danger] ##### 案例 ~~~ const fs = require('fs') // 读取文件目录 a/b/c fs.readdir('a', (err, files) => { if (err) { console.log(err) } else { console.log(files) // [ 'b' ] } }) // 读取文件目录 a/b/c fs.readdir('a', { withFileTypes: true }, (err, files) => { if (err) { console.log(err) } else { console.log(files) // [ Dirent { name: 'b', [Symbol(type)]: 2 } ] } }) ~~~ >[danger] ### fs.readdirSync(path[, options]) `fs.readdirSync(path[, options])`是Node.js中用于同步读取目录中的所有文件和子目录的方法。 >[danger] ##### api 1. 参数: * `path`:要读取的目录的路径。 * `options`:可选参数,用于指定读取目录时的选项,如`encoding`、`withFileTypes`等。 2. `withFileTypes`是`fs.readdir()`方法的一个可选参数,它指定返回的文件名数组中是否包含文件的类型信息。 当`withFileTypes`设置为`true`时,返回的数组中将包含一个`fs.Dirent`对象数组,该对象包含文件名、文件类型以及其他文件信息。`fs.Dirent`对象有两个属性:`name`和`isDirectory()`。`name`属性是文件或目录的名称,`isDirectory()`方法返回一个布尔值,表示该文件是否是一个目录。 当`withFileTypes`设置为`false`或未指定时,返回的数组中只包含文件名字符串数组。 >[danger] ##### 案例 ~~~ // 读取文件目录 a/b/c const ls = fs.readdirSync('a') console.log(ls) // [ 'b' ] // 读取文件目录 a/b/c const ls = fs.readdirSync('a', { withFileTypes: true }) console.log(ls) // [ Dirent { name: 'b', [Symbol(type)]: 2 } ] ~~~ >[danger] ### fs.promises.readdir(path[, options]) 1. `fs.promises.readdir(path[, options])`是Node.js中用于异步读取目录中的所有文件和子目录的Promise方法。 >[danger] ##### api * `path`:要读取的目录的路径。 * `options`:可选参数,用于指定读取目录时的选项,如`encoding`、`withFileTypes`等。 2. `withFileTypes`是`fs.readdir()`方法的一个可选参数,它指定返回的文件名数组中是否包含文件的类型信息。 当`withFileTypes`设置为`true`时,返回的数组中将包含一个`fs.Dirent`对象数组,该对象包含文件名、文件类型以及其他文件信息。`fs.Dirent`对象有两个属性:`name`和`isDirectory()`。`name`属性是文件或目录的名称,`isDirectory()`方法返回一个布尔值,表示该文件是否是一个目录。 当`withFileTypes`设置为`false`或未指定时,返回的数组中只包含文件名字符串数组。 >[danger] ##### 案例 ~~~ const { readdir } = require('fs/promises') readdir('./a', { withFileTypes: true }).then(console.log) // [ Dirent { name: 'b', [Symbol(type)]: 2 } ] ~~~ >[info] ## 递归读取当前文件下的所有结构目录 1. 在上面的代码中,我们将`const result = { dir: [], files: [] }`作为`readDirRecursive()`函数的默认参数,并在函数内部将目录和文件分别添加到`result.dir`和`result.files`属性中。我们使用递归方式调用`readDirRecursive()`函数,以便将子目录中的文件和目录也添加到`result`对象中。 ~~~ const fs = require('fs') const path = require('path') // 递归读取文件夹和文件 function readDirRecursive(dir, result = { dir: [], files: [] }) { try { const files = fs.readdirSync(dir, { withFileTypes: true }) files.forEach((file) => { if (file.isDirectory()) { const subDir = path.join(dir, file.name) result.dir.push(subDir) readDirRecursive(subDir, result) } else { const filePath = path.join(dir, file.name) result.files.push(filePath) } }) } catch (err) { console.error(`Failed to read directory ${dir}: ${err.message}`) } return result } const result = readDirRecursive('a') console.log(result) ~~~