>[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
- 網絡開發