>[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)
~~~
- 基础
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 对比node 和java 使用场景
- node 模块管理
- 内置模块 -- buffer
- 内置模块 -- fs
- fs -- 文件描述符
- fs -- 打开文件 api
- fs -- 文件读取 api
- fs -- 文件写入 api
- fs -- 创建目录 api
- fs -- 读取文件目录结构 api
- fs -- 文件状态(信息) api
- fs -- 删除文件/目录 api
- fs -- 重命名 api
- fs -- 复制文件 api
- 内置模块 -- events
- 内置模块 -- stream
- 可读流 -- Readable
- 可写流 -- Writable
- Duplex
- Transform
- 内置模块 -- http
- http -- 从客户端发起
- http -- 从服务端发起
- 内置模块 -- url
- 网络开发