ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[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 方法操作参考文件扫描符章节