>[success] # 打开文件 -- open
1. `Node.js`中的`fs.open()`方法用于打开一个文件,并返回一个文件描述符(`fd`)。文件描述符是操作系统为了管理文件而提供的一个抽象概念,它是一个非负整数,用于标识一个打开的文件。通过文件描述符,我们可以使用底层的系统调用进行文件操作,例如读取文件内容、写入文件内容、关闭文件等
2. `fs.promises.open()`方法打开文件时,我们可以直接获取到`FileHandle`对象
3. 注意两者不同当我们使用`fs.open()`方法打开文件时,我们只能获取到文件描述符(fd),但 `fs.promises.open()`是可以直接`FileHandle`对象
4. 使用文件描述符进行文件读取的方式更加底层,需要手动打开文件,获取文件描述符,然后使用文件描述符进行读取操作,最后再手动关闭文件
5. 关于 `flag `参数说明
* `'r'`:以读取模式打开文件。
* `'r+'`:以读写模式打开文件。
* `'w'`:以写入模式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件内容。
* `'w+'`:以读写模式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件内容。
* `'a'`:以**追加模式**打开文件,如果文件不存在则创建文件。
* `'a+'`:以**读取追加模式**打开文件,如果文件不存在则创建文件。
>[info] ## 使用 `fs.open(path[, flags[, mode]], callback)`
| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| `path` | `string` | 要打开的文件路径。 |
| `flags` | `string` | 打开文件的方式,可以是以下值之一:`'r'`,`'r+'`,`'w'`,`'w+'`,`'a'`或`'a+'`。`flags`参数默认是 undefined,如果没有指定`flags`参数,则默认以读取模式`'r'`打开文件 |
| `mode` | `number` | 文件权限,默认为`0o666`,表示所有用户都有读写权限。 |
| `callback` | `Function` | 回调函数,接收两个参数,第一个参数是错误对象,第二个参数是打开的文件描述符(一个整数),用于后续的文件操作。 |
>[danger] ##### 代码案例使用read 读
~~~
const fs = require('fs')
fs.open('b.txt', (err, fd) => {
if (err) {
console.log(err)
} else {
console.log(fd)
// 需要能直接操作fd 的api 进行操作读写
fs.read(fd, (err, data, buffer) => {
if (err) {
console.log(err)
} else {
console.log(buffer.toString(), '--')
}
// 关闭文件
// fs.close(fd)
fs.close(fd, (err) => {
if (err) {
console.error(err)
return
}
})
})
}
})
~~~
>[danger] ##### 代码案例使用write 写入
~~~
const fs = require('fs')
// 打开文件并且末尾追加
fs.open('b.txt', 'a', (err, fd) => {
if (err) {
console.log(err)
} else {
fs.write(fd, 'hello world', (err) => {
if (err) {
console.log(err)
} else {
console.log('写入成功')
}
})
}
})
~~~
>[info] ## 使用 fs.promises.open(path[, flags[, mode]])
1. `fs.promises.open()`是 Node.js 的`fs`模块中提供的一个 Promise 风格的 API,用于打开文件并返回一个文件描述符(file descriptor)对象,以便后续对文件进行读取、写入等操作。与`fs.open()`方法相比,`fs.promises.open()`的使用方式更加简洁、方便。
2. `fs.promises.open()`方法返回一个 Promise 对象,如果文件打开成功,则 Promise 对象会被 resolved,并将文件描述符对象作为参数传递给回调函数;如果文件打开失败,则 Promise 对象会被 rejected,并将错误对象作为参数传递给回调函数。
3. `fs.promises.open(path[, flags[, mode]])`该方法接收三个参数,其中 `path `参数是要打开的文件路径,`flags` 参数是打开文件的方式,`mode `参数是文件权限。`flags `和 `mode `参数都是可选的,如果不传递,则默认以读取模式打开文件
4. **方法返回一个 Promise 对象,该 Promise 对象会被 resolved 并返回一个文件描述符对象** 注意和不同 `fs.open` 返回的是文件描述符(`fd`)
| 参数名 | 类型 | 描述 |
| --- | --- | --- |
| `path` | `string` | 要打开的文件路径。 |
| `flags` | `string` | 打开文件的方式,可以是以下值之一:`'r'`,`'r+'`,`'w'`,`'w+'`,`'a'`或`'a+'`。 |
| `mode` | `number` | 文件权限,默认为`0o666`,表示所有用户都有读写权限。 |
>[danger] ##### 使用文件描述符对象(fileHandle) 读取
~~~
const fs = require('fs').promises
// 打开文件并且读取文件内容
async function readFile() {
let fileHandle
try {
// 获取文件句柄
fileHandle = await fs.open('./b.txt')
// 读取文件内容
const data = await fileHandle.readFile('utf-8')
console.log(data)
} catch (e) {
console.log(e)
} finally {
// 关闭文件
await fileHandle.close()
}
}
readFile()
~~~
>[danger] ##### 使用文件描述符对象(fileHandle) 写入
~~~
const fs = require('fs').promises
// 打开文件并且读取文件内容
async function writeFile() {
let fileHandle
try {
// 获取文件句柄
fileHandle = await fs.open('./b.txt', 'a+')
// 写入文件内容
await fileHandle.writeFile('hello world', {
encoding: 'utf-8',
})
console.log('Data written to file.' + data)
} catch (error) {
console.error(error)
} finally {
// 关闭文件
if (fileHandle) {
await fileHandle.close()
}
}
}
writeFile()
~~~
>[danger] ##### fs.openSync 同步打开获取是fd
>[danger] ##### 说明
1. 更多关于fileHandle 方法操作参考文件扫描符章节
- 基础
- 什么是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
- 网络开发