>[success] # 复制文件
1. 要注意的是**只能复制文件不能复制文件夹**
2. **要被复制的文件目录中的文件夹要是已存在的状态**,否则您在复制文件之前没有手动创建目标文件夹,那么 Node.js 会尝试将它视为文件名,并报错`ENOENT: no such file or directory`。
| API | 描述 |
| --- | --- |
| `fs.copyFile(src, dest[, flags], callback)` | 异步复制文件 |
| `fs.copyFileSync(src, dest[, flags])` | 同步复制文件 |
| `fsPromises.copyFile(src, dest[, mode])` | 异步复制文件 (Promise-based) |
>[danger] ### fs.copyFile(src, dest\[, flags\], callback)
1. `fs.copyFile(src, dest[, flags], callback)`是 Node.js 中用于异步复制文件的 API,它可以将源文件复制到目标文件中。
>[danger] ##### api
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| src | string|Buffer|URL | 要复制的源文件名 |
| dest | string|Buffer|URL | 复制操作的目标文件名 |
| flags | integer | 可选参数,用于指定复制操作的行为。默认值为 0。可以使用掩码组合以下标志:fs.constants.COPYFILE\_EXCL、fs.constants.COPYFILE\_FICLONE 或 fs.constants.COPYFILE\_FICLONE\_FORCE。 |
| callback | Function | 异步操作完成后的回调函数。如果出错,将返回错误;否则返回 undefined。 |
下面是 flags 参数的可选值:
| 值 | 描述 |
| --- | --- |
| fs.constants.COPYFILE\_EXCL | 如果 dest 已经存在,则复制操作将失败。 |
| fs.constants.COPYFILE\_FICLONE | 复制操作将尝试创建写时复制引用链接。如果平台不支持写时复制,则使用后备复制机制。 |
| fs.constants.COPYFILE\_FICLONE\_FORCE | 复制操作将尝试创建写时复制引用链接。如果平台不支持写时复制,则该操作将失败。 |
>[danger] ##### 案例
~~~
const fs = require('fs')
fs.copyFile('b/z.txt', 'a/zz.txt', (err) => {
if (err) throw err
console.log('copy done')
})
~~~
~~~
import { copyFileSync, constants } from 'fs';
// 默认情况下将创建或覆盖 destination.txt。
copyFileSync('source.txt', 'destination.txt');
console.log('source.txt was copied to destination.txt');
// 通过使用 COPYFILE_EXCL,如果 destination.txt 存在,则该操作将失败。
copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
~~~
>[danger] ### fs.copyFileSync(src, dest[, mode])
1. `fs.copyFileSync(src, dest[, mode])`是Node.js中fs模块的一个同步方法,用于将源文件(src)复制到目标文件(dest)。如果目标文件已经存在,则会被覆盖
2. 使用该方法时,如果源文件不存在或不可读,或目标文件的目录不存在或不可写,都会抛出异常。因此,在使用该方法之前,需要确保源文件和目标文件的路径都是正确的,并且具有相应的文件权限
>[danger] ##### api
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| src | string|Buffer|URL | 要复制的源文件名 |
| dest | string|Buffer|URL | 复制操作的目标文件名 |
| mode | integer | 可选,复制操作的修饰符,默认为0 |
| 返回值 | undefined | 同步地复制 src 到 dest,如果 dest 已经存在,则会被覆盖,Node.js 不保证复制操作的原子性。如果在打开目标文件进行写入后发生错误,Node.js 将尝试删除目标文件。 |
| mode选项 | 行为 |
| --- | --- |
| fs.constants.COPYFILE\_EXCL | 如果 dest 已经存在,则复制操作将失败 |
| fs.constants.COPYFILE\_FICLONE | 复制操作将尝试创建写时复制引用链接。如果平台不支持写时复制,则使用后备复制机制 |
| fs.constants.COPYFILE\_FICLONE\_FORCE | 复制操作将尝试创建写时复制引用链接。如果平台不支持写时复制,则该操作将失败 |
>[danger] ##### 案例
~~~
const fs = require('fs')
try {
fs.copyFileSync('b/z.txt', 'zz.txt')
} catch (e) {
console.log(e)
}
~~~
~~~
import { copyFileSync, constants } from 'fs';
// 默认情况下将创建或覆盖 destination.txt。
copyFileSync('source.txt', 'destination.txt');
console.log('source.txt was copied to destination.txt');
// 通过使用 COPYFILE_EXCL,如果 destination.txt 存在,则该操作将失败。
copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
~~~
>[danger] ### fsPromises.copyFile(src, dest[, mode])
1. 异步地将`src`复制到`dest`。 默认情况下,如果`dest`已经存在,则会被覆盖。
>[danger] ##### api
| 参数 | 类型 | 描述 |
| --- | --- | --- |
| src | string | Buffer |
| dest | string | Buffer |
| flags | integer | 可选参数,用于指定复制操作的行为。默认值为 0。可以使用掩码组合以下标志:fs.constants.COPYFILE\_EXCL、fs.constants.COPYFILE\_FICLONE 或 fs.constants.COPYFILE\_FICLONE\_FORCE。 |
下面是 flags 参数的可选值:
| 值 | 描述 |
| --- | --- |
| fs.constants.COPYFILE\_EXCL | 如果 dest 已经存在,则复制操作将失败。 |
| fs.constants.COPYFILE\_FICLONE | 复制操作将尝试创建写时复制引用链接。如果平台不支持写时复制,则使用后备复制机制。 |
| fs.constants.COPYFILE\_FICLONE\_FORCE | 复制操作将尝试创建写时复制引用链接。如果平台不支持写时复制,则该操作将失败。 |
>[danger] ##### 案例
~~~js
import { constants } from 'fs';
import { copyFile } from 'fs/promises';
try {
await copyFile('source.txt', 'destination.txt');
console.log('source.txt was copied to destination.txt');
} catch {
console.log('The file could not be copied');
}
// 通过使用 COPYFILE_EXCL,如果 destination.txt 存在,则该操作将失败。
try {
await copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
console.log('source.txt was copied to destination.txt');
} catch {
console.log('The file could not be copied');
}
~~~
- 基础
- 什么是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
- 网络开发