On this page

文件系统

History
Source Code: lib/fs.js

稳定性:2 - 稳定

node:fs 模块启用了一种基于标准 POSIX 函数建模的文件系统交互方式。

要使用基于 Promise 的 API:

要使用回调和同步 API:

所有文件系统操作都有同步、回调和基于 Promise 的形式,并且都可以使用 CommonJS 语法和 ES6 模块(ESM)访问。

基于 Promise 的操作会返回一个 promise,当异步操作完成时,该 promise 会被兑现。

import { unlink } from 'node:fs/promises';

try {
  await unlink('/tmp/hello');
  console.log('成功删除 /tmp/hello');
} catch (error) {
  console.error('发生了错误:', error.message);
}
const { unlink } = require('node:fs/promises');

(async function(path) {
  try {
    await unlink(path);
    console.log(`成功删除 ${path}`);
  } catch (error) {
    console.error('发生了错误:', error.message);
  }
})('/tmp/hello');

回调形式将完成回调函数作为其最后一个参数,并异步调用操作。传递给完成回调的参数取决于方法,但第一个参数始终保留给异常。如果操作成功完成,则第一个参数为 nullundefined

import { unlink } from 'node:fs';

unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('成功删除 /tmp/hello');
});
const { unlink } = require('node:fs');

unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('成功删除 /tmp/hello');
});

当需要最大性能(在执行时间和内存分配方面)时,node:fs 模块 API 的基于回调的版本优于使用 Promise API。

同步 API 会阻塞 Node.js 事件循环和进一步的 JavaScript 执行,直到操作完成。异常会立即抛出,可以使用 try…catch 处理,也可以允许其向上冒泡。

import { unlinkSync } from 'node:fs';

try {
  unlinkSync('/tmp/hello');
  console.log('成功删除 /tmp/hello');
} catch (err) {
  // 处理错误
}
const { unlinkSync } = require('node:fs');

try {
  unlinkSync('/tmp/hello');
  console.log('成功删除 /tmp/hello');
} catch (err) {
  // 处理错误
}

fs/promises API 提供返回 Promise 的异步文件系统方法。

Promise API 使用底层的 Node.js 线程池在事件循环线程之外执行文件系统操作。这些操作不会进行同步,也不是线程安全的。在对同一文件执行多个并发修改时必须格外小心,否则可能会发生数据损坏。

类:FileHandle

History

FileHandle 对象是数值型文件描述符的对象包装器。

FileHandle 对象的实例由 fsPromises.open() 方法创建。

所有 FileHandle 对象都是 EventEmitter

如果未使用 filehandle.close() 方法关闭 FileHandle,它将尝试自动关闭文件描述符并发出进程警告,以帮助防止内存泄漏。请不要依赖此行为,因为它可能不可靠,文件也可能不会被关闭。相反,请始终显式关闭 FileHandle。Node.js 将来可能会更改此行为。

事件:'close'

History

FileHandle 已关闭且无法再使用时,会发出 'close' 事件。

filehandle.appendFile(data, options?): void
Attributes
options:Object | string
encoding:string | null
默认值: 'utf8'
允许中止正在进行的 writeFile。 默认值: undefined

filehandle.writeFile() 的别名。

操作文件句柄时,无法更改通过 fsPromises.open() 设置的模式。因此,这等同于 filehandle.writeFile()

M

filehandle.chmod

History
filehandle.chmod(mode): void
Attributes
mode:integer
文件模式位掩码。

修改文件权限。参见 chmod(2)

M

filehandle.chown

History
filehandle.chown(uid, gid): void
Attributes
文件新所有者的用户 ID。
文件新所属组的组 ID。

更改文件的所有权。chown(2) 的包装器。

M

filehandle.close

History
filehandle.close(): void
  • 返回:Promise 成功时兑现为 undefined

等待句柄上的所有待处理操作完成后关闭文件句柄。

import { open } from 'node:fs/promises';

let filehandle;
try {
  filehandle = await open('thefile.txt', 'r');
} finally {
  await filehandle?.close();
}
M

filehandle.createReadStream

History
filehandle.createReadStream(options?): void
Attributes
options:Object
encoding:string
默认值: null
autoClose:boolean
默认值: true
emitClose:boolean
默认值: true
start:integer
默认值: Infinity
highWaterMark:integer
默认值: 64 * 1024
默认值: undefined

options 可以包含 startend 值,以读取文件中的一段字节,而不是整个文件。startend 都是包含的,并从 0 开始计数,允许的值在 [0, Number.MAX_SAFE_INTEGER] 范围内。如果省略 start 或其值为 undefinedfilehandle.createReadStream() 将从当前文件位置开始顺序读取。encoding 可以是 Buffer 所接受的任意编码。

如果 FileHandle 指向仅支持阻塞读取的字符设备(例如键盘或声卡),读取操作将一直持续到数据可用。这可能会阻止进程退出以及流自然关闭。

默认情况下,流销毁后会发出 'close' 事件。将 emitClose 选项设置为 false 可以更改此行为。

import { open } from 'node:fs/promises';

const fd = await open('/dev/input/event0');
// 从某个字符设备创建流。
const stream = fd.createReadStream();
setTimeout(() => {
  stream.close(); // 这可能不会关闭流。
  // 人为标记流结束,就像底层资源自行指示文件结束一样,
  // 这样可以让流关闭。
  // 这不会取消待处理的读取操作;如果存在此类操作,
  // 则进程可能仍无法成功退出,直到该操作完成。
  stream.push(null);
  stream.read(0);
}, 100);

如果 autoClose 为 false,即使发生错误,文件描述符也不会关闭。应用程序负责关闭文件描述符,并确保不会发生文件描述符泄漏。如果 autoClose 设置为 true(默认行为),则在 'error''end' 时文件描述符会自动关闭。

下面是读取长度为 100 字节的文件的最后 10 个字节的示例:

import { open } from 'node:fs/promises';

const fd = await open('sample.txt');
fd.createReadStream({ start: 90, end: 99 });
filehandle.createWriteStream(options?): void
Attributes
options:Object
encoding:string
默认值: 'utf8'
autoClose:boolean
默认值: true
emitClose:boolean
默认值: true
start:integer
highWaterMark:number
默认值: 参见 stream.getDefaultHighWaterMark()
flush:boolean
如果为 true ,则在关闭底层文件描述符之前刷新它。 默认值: false

options 还可以包含 start 选项,以允许在文件开头之后的某个位置写入数据,允许的值在 [0, Number.MAX_SAFE_INTEGER] 范围内。修改文件而不是替换文件时,可能需要将 flags open 选项设置为 r+,而不是默认值 rencoding 可以是 Buffer 所接受的任意编码。

默认情况下,如果 autoClose'error''finish' 时设置为 true,文件描述符将自动关闭。如果 autoClose 为 false,即使发生错误,文件描述符也不会关闭。应用程序负责关闭文件描述符,并确保不会发生文件描述符泄漏。

默认情况下,流销毁后会发出 'close' 事件。将 emitClose 选项设置为 false 可以更改此行为。

M

filehandle.datasync

History
filehandle.datasync(): void
  • 返回:Promise 成功时兑现为 undefined

强制将当前与文件关联的所有排队 I/O 操作置于操作系统的同步 I/O 完成状态。有关详细信息,请参阅 POSIX fdatasync(2) 文档。

filehandle.sync 不同,此方法不会刷新已修改的元数据。

P

filehandle.fd

History
M

filehandle.pull

History
filehandle.pull(...transforms?, options?): void

稳定性:1 - 实验性

Attributes
...transforms:Function | Object
可选的转换,通过 stream/iter pull() 应用。
options:Object
autoClose:boolean
流结束时关闭文件句柄。 默认: false
start:number
开始读取的字节偏移量。指定时,读取使用显式定位( pread 语义)。 默认: 当前文件位置。
limit:number
迭代器结束前读取的最大字节数。当已传递 limit 个字节或到达文件末尾时停止读取,以先发生者为准。 默认: 读取到文件末尾。
chunkSize:number
为每次读取操作分配的缓冲区大小(字节)。 默认: 131072 (128 KB)。

使用 node:stream/iter pull 模型将文件内容作为异步迭代器返回。读取以 chunkSize 字节块(默认 128 KB)执行。如果提供了转换,它们将通过 stream/iter pull() 应用。

当迭代器被消费时文件句柄被锁定,当迭代完成、发生错误或消费者中断时解锁。

此函数仅在启用 --experimental-stream-iter 标志时可用。

M

filehandle.pullSync

History
filehandle.pullSync(...transforms?, options?): void

稳定性:1 - 实验性

Attributes
...transforms:Function | Object
可选的转换,通过 stream/iter pullSync() 应用。
options:Object
autoClose:boolean
流结束时关闭文件句柄。 默认: false
start:number
开始读取的字节偏移量。指定时,读取使用显式定位。 默认: 当前文件位置。
limit:number
迭代器结束前读取的最大字节数。 默认: 读取到文件末尾。
chunkSize:number
为每次读取操作分配的缓冲区大小(字节)。 默认: 131072 (128 KB)。

filehandle.pull() 的同步对应物。返回一个同步迭代器,使用主线程上的同步 I/O 读取文件。读取以 chunkSize 字节块(默认 128 KB)执行。

当迭代器被消费时文件句柄被锁定。与异步 pull() 不同,此方法不支持 AbortSignal,因为所有操作都是同步的。

此函数仅在启用 --experimental-stream-iter 标志时可用。

M

filehandle[Symbol.asyncDispose]

History
filehandle[Symbol.asyncDispose](): void

调用 filehandle.close() 并返回一个 promise,当文件句柄关闭时该 promise 会兑现。

此方法支持将文件句柄与 await using 一起使用。作用域退出时,文件将自动关闭。有关更多信息,请参阅 MDN 关于 using 语句的文档

M

fsPromises.access

History
fsPromises.access(path, mode?): void
Attributes
path:string | Buffer | URL
mode:integer
默认: fs.constants.F_OK

测试用户对 path 指定的文件或目录的权限。mode 参数是一个可选整数,指定要执行的可访问性检查。mode 应为值 fs.constants.F_OK 或由任何 fs.constants.R_OKfs.constants.W_OKfs.constants.X_OK 的按位 OR 组成的掩码(例如 fs.constants.W_OK | fs.constants.R_OK)。检查 文件访问常量 以获取 mode 的可能值。

如果可访问性检查成功,则 promise 兑现且不带值。如果任何可访问性检查失败,则 promise 被拒绝并带有 Error 对象。以下示例检查当前进程是否可以读取和写入文件 /etc/passwd

import { access, constants } from 'node:fs/promises';

try {
  await access('/etc/passwd', constants.R_OK | constants.W_OK);
  console.log('可以访问');
} catch {
  console.error('无法访问');
}

在调用 fsPromises.open() 之前使用 fsPromises.access() 检查文件的可访问性是不推荐的。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应直接打开/读取/写入文件并处理如果文件不可访问时引发的错误。

fsPromises.appendFile(path, data, options?): void
Attributes
文件名或 FileHandle
options:Object | string
encoding:string | null
默认: 'utf8'
mode:integer
默认: 0o666
flag:string
参见 [文件系统 flags 的支持][]。 默认: 'a'
flush:boolean
如果为 true ,则在关闭之前刷新底层文件描述符。 默认: false

异步地向文件追加数据,如果文件尚不存在则创建该文件。 data 可以是字符串、缓冲区、AsyncIterableIterable 对象。

如果 options 是字符串,则它指定 encoding

mode 选项仅影响新创建的文件。有关更多详细信息,请参阅 fs.open()

path 可以指定为已打开用于追加的 FileHandle(使用 fsPromises.open())。

M

fsPromises.chmod

History
fsPromises.chmod(path, mode): void
Attributes
path:string | Buffer | URL

更改文件的权限。

M

fsPromises.chown

History
fsPromises.chown(path, uid, gid): void
Attributes

更改文件的所有权。

fsPromises.copyFile(src, dest, mode?): void
Attributes
src:string | Buffer | URL
要复制的源文件名
dest:string | Buffer | URL
复制操作的目标文件名
mode:integer
指定复制行为的可选修饰符。可以创建由两个或更多值的按位 OR 组成的掩码(例如 fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE默认: 0
fs.constants.COPYFILE_EXCL:
:如果 dest 已存在,则复制操作将失败。
fs.constants.COPYFILE_FICLONE:
:复制操作将尝试创建写时复制 reflink。如果平台不支持写时复制,则使用回退复制机制。
fs.constants.COPYFILE_FICLONE_FORCE:
:复制操作将尝试创建写时复制 reflink。如果平台不支持写时复制,则操作将失败。

异步将 src 复制到 dest。默认情况下,如果 dest 已存在则将其覆盖。

不保证复制操作的原子性。如果在打开目标文件进行写入后发生错误,将尝试删除目标文件。

import { copyFile, constants } from 'node:fs/promises';

try {
  await copyFile('source.txt', 'destination.txt');
  console.log('source.txt 已复制到 destination.txt');
} catch {
  console.error('无法复制该文件');
}

// 通过使用 COPYFILE_EXCL,如果 destination.txt 存在,操作将失败。
try {
  await copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
  console.log('source.txt 已复制到 destination.txt');
} catch {
  console.error('无法复制该文件');
}
fsPromises.cp(src, dest, options?): void
Attributes
src:string | URL
要复制的源路径。
dest:string | URL
要复制到的目标路径。
options:Object
dereference:boolean
解引用符号链接。 默认: false
errorOnExist:boolean
forcefalse 且目标存在时,抛出错误。 默认: false
filter:Function
用于过滤复制的文件/目录的函数。返回 true 以复制该项目, false 以忽略它。当忽略目录时,其所有内容也将被跳过。也可以返回一个 Promise 解析为 truefalse 默认: undefined
src:string
要复制的源路径。
dest:string
要复制到的目标路径。
force:boolean
覆盖现有文件或目录。如果将此设置为 false 且目标存在,则复制操作将忽略错误。使用 errorOnExist 选项来更改此行为。 默认: true
mode:integer
复制操作的修饰符。 默认: 0 。参见 fsPromises.copyFile()mode 标志。
preserveTimestamps:boolean
当为 true 时,将保留 src 的时间戳。 默认: false
recursive:boolean
递归复制目录 默认: false
verbatimSymlinks:boolean
当为 true 时,将跳过符号链接的路径解析。 默认: false

异步将整个目录结构从 src 复制到 dest,包括子目录和文件。

当将目录复制到另一个目录时,不支持 globs,行为类似于 cp dir1/ dir2/

fsPromises.glob(pattern, options?): void
Attributes
pattern:string | string[]
options:Object
cwd:string | URL
当前工作目录。 默认: process.cwd()
exclude:Function | string[]
用于过滤掉文件/目录的函数,或者 要排除的 glob 模式列表。如果提供的是函数,则返回 true 表示排除该项目, false 表示包含它。 默认: undefined 。 如果提供的是字符串数组,则每个字符串都应为指定要排除路径的 glob 模式。注意:不支持否定模式(例如 !foo.js )。
followSymlinks:boolean
当为 true 时,在展开 ** 模式时会跟随指向目录的符号链接。 默认: false
withFileTypes:boolean
如果 glob 应将路径作为 Dirent 返回则为 true ,否则为 false默认: false

当启用 followSymlinks 时,检测到的符号链接循环不会被递归遍历。

import { glob } from 'node:fs/promises';

for await (const entry of glob('**/*.js'))
  console.log(entry);
const { glob } = require('node:fs/promises');

(async () => {
  for await (const entry of glob('**/*.js'))
    console.log(entry);
})();

fs.chmod()

History

稳定性:0 - 已弃用

更改符号链接上的权限。

此方法仅在 macOS 上实现。

fs.chown()

History

更改符号链接的所有权。

fs.lutimes()

History

以与 [fs.utimes][] 相同的方式更改文件的访问和修改时间,不同之处在于如果路径引用符号链接,则链接不会被解引用:相反,符号链接本身的时间戳会被更改。

History

从 existingPath 到 newPath 创建新链接。有关更多详细信息,请参阅 POSIX link(2) 文档。

等同于 [fs.stat][],除非 path 引用符号链接,在这种情况下统计的是链接本身,而不是它引用的文件。有关更多详细信息,请参阅 POSIX lstat(2) 文档。

fs.mkdir()

History
  • path string | Buffer | URL
  • options Object | integer
  • 返回:Promise 成功时,如果 recursive 为 false 则 fulfilled 为 undefined,如果 recursive 为 true 则 fulfilled 为创建的第一个目录路径。

异步创建目录。

可选的 options 参数可以是指定 mode(权限和粘滞位)的整数,也可以是具有 mode 属性和指示是否应创建父目录的 recursive 属性的对象。当 path 是已存在的目录时调用 mkdir 仅在 recursive 为 false 时导致 rejection。

import { mkdir } from 'node:fs/promises';

try {
  const projectFolder = new URL('./test/project/', import.meta.url);
  const createDir = await mkdir(projectFolder, { recursive: true });

  console.log(`已创建 ${createDir}`);
} catch (err) {
  console.error(err.message);
}
const { mkdir } = require('node:fs/promises');
const { join } = require('node:path');

async function makeDirectory() {
  const projectFolder = join(__dirname, 'test', 'project');
  const dirCreation = await mkdir(projectFolder, { recursive: true });

  console.log(dirCreation);
  return dirCreation;
}

makeDirectory().catch(console.error);
fs.promises.mkdtemp(): void
Attributes
prefix:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'

创建一个唯一的临时目录。唯一的目录名是通过在提供的 prefix 末尾追加六个随机字符生成的。由于平台不一致性,避免在 prefix 中使用尾随的 X 字符。某些平台(尤其是 BSD 系列)可能会返回超过六个随机字符,并将 prefix 中尾随的 X 字符替换为随机字符。

可选的 options 参数可以是指定编码的字符串,也可以是具有 encoding 属性的对象,用于指定要使用的字符编码。

import { mkdtemp } from 'node:fs/promises';
import { join } from 'node:path';
import { tmpdir } from 'node:os';

try {
  await mkdtemp(join(tmpdir(), 'foo-'));
} catch (err) {
  console.error(err);
}
M

mkdtemp

History
mkdtemp(): void
Attributes
prefix:string | Buffer | URL
options:string | Object
encoding:string
默认值: utf8
path:string
创建的目录的路径。
一个用于移除已创建目录的函数。
remove 相同。

生成的 Promise 持有一个异步可处置对象,其 path 属性持有创建的目录路径。当对象被处置时,如果目录仍然存在,目录及其内容将被异步移除。如果无法删除目录,处置将抛出错误。该对象具有一个异步 dispose 方法,将执行相同的任务。

此函数和结果对象上的处置函数都是异步的,因此应结合 await + await using 使用,例如: await using dir = await fsPromises.mkdtempDisposable('prefix')

有关显式资源管理的更多信息,请参阅 MDN 关于 using 语句的文档

详细信息,请参阅 [mkdtempDisposable()][] 的文档。

可选的 encoding 参数可以是指定编码的字符串,也可以是具有 encoding 属性的对象,用于指定要使用的字符编码。

M

open

History
open(): void
Attributes
path:string | Buffer | URL
flags:string | number
参见 [文件系统标志的支持][]。 默认值: r
如果文件被创建,设置文件模式(权限和粘滞位)。 参见 文件模式 了解更多详情。 默认值: 0o666 (可读和可写)

打开一个 FileHandle

请参阅 POSIX open(2) 文档了解更多详情。

某些字符(<, >, :, ", |, ?, *)在 Windows 下是保留的,详见 命名文件、路径和命名空间。在 NTFS 下,如果文件名包含冒号,Node.js 将打开一个文件系统流,如 此 MSDN 页面 所述。

M

opendir

History
opendir(): void
Attributes
path:string | Buffer | URL
options:Object
encoding:string | null
默认值: utf8
bufferSize:number
从目录读取时内部缓冲的目录条目数。 较高的值会带来更好的性能,但内存使用量也更高。 默认值: 32
recursive:boolean
解析后的 opendir() 将是一个 AsyncIterable , 包含所有子文件和目录。 默认值: false

异步打开一个目录以进行迭代扫描。请参阅 POSIX opendir(3) 文档了解更多详情。

创建一个 fs.Dir,其中包含所有用于从目录读取和清理目录的函数。

encoding 选项设置在打开目录和后续读取操作时 path 的编码。

使用异步迭代的示例:

import { opendir } from 'node:fs/promises';

try {
  const dir = await opendir('./');
  for await (const dirent of dir)
    console.log(dirent.name);
} catch (err) {
  console.error(err);
}

使用异步迭代器时,fs.Dir 对象将在迭代器退出后自动关闭。

fsPromises.readdir(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'
withFileTypes:boolean
默认值: false
recursive:boolean
如果为 true ,则递归读取目录内容。 在递归模式下,它将列出所有文件、子文件和目录。 默认值: false

读取目录的内容。

可选的 options 参数可以是指定编码的字符串,也可以是具有 encoding 属性的对象,用于指定用于文件名的字符编码。如果 encoding 设置为 'buffer',返回的文件名将作为 Buffer 对象传递。

如果 options.withFileTypes 设置为 true,返回的数组将包含 fs.Dirent 对象。

import { readdir } from 'node:fs/promises';

try {
  const files = await readdir(path);
  for (const file of files)
    console.log(file);
} catch (err) {
  console.error(err);
}
fsPromises.readFile(path, options?): void
Attributes
文件名或 FileHandle
options:Object | string
encoding:string | null
默认值: null
flag:string
参见 [对文件系统 flags 的支持][]. 默认值: 'r'
允许中止正在进行的 readFile
要读取到其中的缓冲区,或一个 接收文件大小并返回缓冲区的函数。

异步读取文件的全部内容。

如果未指定编码(使用 options.encoding),数据将作为 Buffer 对象返回。否则,数据将是字符串。

如果 options 是字符串,则它指定编码。

如果提供了 buffer 且未指定编码,返回的 Buffer 将 是所提供缓冲区上的一个视图,其中只包含已读取的字节。如果 所提供的缓冲区太小,无法容纳整个文件,则该 promise 将被 拒绝。

path 是目录时,fsPromises.readFile() 的行为 取决于平台。在 macOS、Linux 和 Windows 上,该 promise 将被拒绝 并返回错误。在 FreeBSD 上,将返回目录内容的表示。

读取位于运行代码同一目录中的 package.json 文件的示例:

import { readFile } from 'node:fs/promises';
try {
  const filePath = new URL('./package.json', import.meta.url);
  const contents = await readFile(filePath, { encoding: 'utf8' });
  console.log(contents);
} catch (err) {
  console.error(err.message);
}
const { readFile } = require('node:fs/promises');
const { resolve } = require('node:path');
async function logFile() {
  try {
    const filePath = resolve('./package.json');
    const contents = await readFile(filePath, { encoding: 'utf8' });
    console.log(contents);
  } catch (err) {
    console.error(err.message);
  }
}
logFile();

可以使用 AbortSignal 中止正在进行的 readFile。如果请求被中止,返回的 Promise 将被 AbortError 拒绝:

import { readFile } from 'node:fs/promises';

try {
  const controller = new AbortController();
  const { signal } = controller;
  const promise = readFile(fileName, { signal });

  // 在 Promise 结算前中止请求。
  controller.abort();

  await promise;
} catch (err) {
  // 当请求被中止时 - err 是一个 AbortError
  console.error(err);
}

中止正在进行的请求不会中止单个操作系统请求,而是中止 fs.readFile 执行的内部缓冲。

任何指定的 FileHandle 必须支持读取。

使用预分配缓冲区和 buffer 选项的示例:

import { Buffer } from 'node:buffer';
import { readFile } from 'node:fs/promises';

const buf = Buffer.alloc(16384);
const contents = await readFile('/path/to/file', { buffer: buf });
console.log(contents); // `buf` 上仅包含已读取字节的视图

使用返回缓冲区的函数时使用 buffer 选项的示例:

import { Buffer } from 'node:buffer';
import { readFile } from 'node:fs/promises';

const contents = await readFile('/path/to/file', {
  buffer: (size) => Buffer.alloc(size),
});
console.log(contents);
M

fsPromises.readlink

History
fsPromises.readlink(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'

读取 path 引用的符号链接内容。请参阅 POSIX readlink(2) 文档了解更多详情。成功时 Promise 兑现为 linkString

可选的 options 参数可以是指定编码的字符串,也可以是具有 encoding 属性的对象,用于指定返回的链接路径所使用的字符编码。如果 encoding 设置为 'buffer',返回的链接路径将作为 Buffer 对象传递。

M

fsPromises.realpath

History
fsPromises.realpath(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'

使用与 fs.realpath.native() 函数相同的语义确定 path 的实际位置。

仅支持可以转换为 UTF8 字符串的路径。

可选的 options 参数可以是指定编码的字符串,也可以是具有 encoding 属性的对象,用于指定路径所使用的字符编码。如果 encoding 设置为 'buffer',返回的路径将作为 Buffer 对象传递。

在 Linux 上,当 Node.js 链接到 musl libc 时,必须将 procfs 文件系统挂载到 /proc 才能使此函数工作。Glibc 没有此限制。

M

fsPromises.rename

History
fsPromises.rename(oldPath, newPath): void
Attributes
oldPath:string | Buffer | URL
newPath:string | Buffer | URL

oldPath 重命名为 newPath

M

fsPromises.rmdir

fsPromises.rmdir(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
目前未暴露任何选项。曾经有 recursivemaxBusyTriesemfileWait 的选项,但它们已 弃用并被移除。 options 参数仍被接受以 保持向后兼容,但它未被使用。

移除由 path 标识的目录。

在文件(非目录)上使用 fsPromises.rmdir() 会导致 Promise 被拒绝,在 Windows 上抛出 ENOENT 错误, 在 POSIX 上抛出 ENOTDIR 错误。

要获得类似于 rm -rf Unix 命令的行为,请使用 fsPromises.rm() 并带有选项 { recursive: true, force: true }

M

fsPromises.rm

History
fsPromises.rm(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
force:boolean
当为 true 时,如果 path 不存在,则忽略异常。 默认值: false
maxRetries:integer
如果遇到 EBUSYEMFILEENFILEENOTEMPTYEPERM 错误,Node.js 将重试操作,每次重试的线性退避等待时间增加 retryDelay 毫秒。此选项 表示重试次数。如果 recursive 选项不为 true ,则忽略此选项。 默认值: 0
recursive:boolean
如果为 true ,则递归移除目录。在 递归模式下,操作失败时会重试。 默认值: false
retryDelay:integer
重试之间等待的时间(毫秒)。如果 recursive 选项不为 true , 则忽略此选项。 默认值: 100

移除文件和目录(基于标准 POSIX rm 工具建模)。

fsPromises.stat(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.Stats 对象中的数值是否应为 bigint默认值: false
throwIfNoEntry:boolean
如果不存在文件系统条目,是否抛出异常, 而不是返回 undefined默认值: true
M

fsPromises.statfs

History
fsPromises.statfs(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.StatFs 对象中的数值是否应为 bigint默认值: false
fsPromises.symlink(target, path, type?): void
Attributes
target:string | Buffer | URL
path:string | Buffer | URL
type:string | null
默认值: null

创建一个符号链接。

type 参数仅在 Windows 平台上使用,可以是 'dir''file''junction' 之一。如果 type 参数为 null,Node.js 将 自动检测 target 类型并使用 'file''dir'。如果 target 不存在, 将使用 'file'。Windows 联接点要求目标 路径为绝对路径。使用 'junction' 时,target 参数将 自动规范化为绝对路径。NTFS 卷上的联接点 只能指向目录。

M

fsPromises.truncate

History
fsPromises.truncate(path, len?): void
Attributes
path:string | Buffer | URL
默认值: 0

path 处的内容截断(缩短或扩展长度)为 len 字节。

M

fsPromises.unlink

History
fsPromises.unlink(path): void
Attributes
path:string | Buffer | URL

如果 path 指的是符号链接,则移除该链接而不影响 该链接所指的文件或目录。如果 path 指的是非 符号链接的文件路径,则删除该文件。请参阅 POSIX unlink(2) 文档了解更多详情。

fsPromises.utimes(path, atime, mtime): void
Attributes
path:string | Buffer | URL
atime:number | string | Date
mtime:number | string | Date

更改由 path 引用的对象的文件系统时间戳。

atimemtime 参数遵循以下规则:

  • 值可以是代表 Unix 纪元时间的数字、Date,或 数字字符串如 '123456789.0'
  • 如果值无法转换为数字,或是 NaNInfinity-Infinity,将抛出 Error
M

fsPromises.watch

History
fsPromises.watch(filename, options?): void
Attributes
filename:string | Buffer | URL
options:string | Object
persistent:boolean
指示只要文件被监视,进程是否应继续运行。 默认值: true
recursive:boolean
指示是否应监视所有子目录, 或仅当前目录。这在指定目录时适用,且仅在支持的平台上有用(参见 注意事项 )。 默认值: false
encoding:string
指定用于传递给监听器的 文件名的字符编码。 默认值: 'utf8'
一个 AbortSignal ,用于信号通知监视器 何时停止。
maxQueue:number
指定在返回的 AsyncIterator 的迭代之间 排队的事件数。 默认值: 2048
overflow:string
当事件数超过 maxQueue 允许的数量时,可以是 'ignore''throw''ignore' 表示溢出事件被丢弃并 发出警告,而 'throw' 表示抛出异常。 默认值: 'ignore'
要忽略的模式。字符串是 glob 模式(使用 minimatch ),RegExp 模式针对 文件名进行测试,函数接收文件名并返回 true 以 忽略。 默认值: undefined
eventType:string
变更类型
filename:string | Buffer | null
变更的文件名。

返回一个异步迭代器,监视 filename 上的更改,其中 filename 可以是文件或目录。

const { watch } = require('node:fs/promises');

const ac = new AbortController();
const { signal } = ac;
setTimeout(() => ac.abort(), 10000);

(async () => {
  try {
    const watcher = watch(__filename, { signal });
    for await (const event of watcher)
      console.log(event);
  } catch (err) {
    if (err.name === 'AbortError')
      return;
    throw err;
  }
})();

在大多数平台上,每当目录中出现或消失文件名时,都会发出 'rename'

fs.watch() 的所有 注意事项 也适用于 fsPromises.watch()

fsPromises.writeFile(file, data, options?): void
Attributes
文件名或 FileHandle
options:Object | string
encoding:string | null
默认值: 'utf8'
mode:integer
默认值: 0o666
flag:string
参见 [文件系统 flags 的支持][]。 默认值: 'w'
flush:boolean
如果所有数据成功写入文件,且 flushtrue ,则使用 filehandle.sync() 刷新数据。 默认值: false
允许中止正在进行的 writeFile

异步将数据写入文件,如果文件已存在则替换它。 data 可以是字符串、缓冲区、AsyncIterableIterable 对象。

如果 data 是缓冲区,则忽略 encoding 选项。

如果 options 是字符串,则它指定编码。

mode 选项仅影响新创建的文件。参见 fs.open() 了解更多详情。

任何指定的 FileHandle 必须支持写入。

在不等待 Promise 结算的情况下多次在同一文件上使用 fsPromises.writeFile() 是不安全的。

类似于 fsPromises.readFile - fsPromises.writeFile 是一个便捷 方法,内部执行多次 write 调用以写入传递给它的缓冲区。对于性能敏感的代码,考虑使用 fs.createWriteStream()filehandle.createWriteStream()

可以使用 AbortSignal 取消 fsPromises.writeFile()。 取消是“尽力而为”,可能仍会有少量数据 被写入。

import { writeFile } from 'node:fs/promises';
import { Buffer } from 'node:buffer';

try {
  const controller = new AbortController();
  const { signal } = controller;
  const data = new Uint8Array(Buffer.from('Hello Node.js'));
  const promise = writeFile('message.txt', data, { signal });

  // 在 Promise 结算前中止请求。
  controller.abort();

  await promise;
} catch (err) {
  // 当请求被中止时 - err 是一个 AbortError
  console.error(err);
}

中止正在进行的请求不会中止单个操作系统 请求,而是中止 fs.writeFile 执行的内部缓冲。

P

fsPromises.constants

History
  • 类型:对象

返回一个包含文件系统操作常用常量的对象。该对象与 fs.constants 相同。参见 [文件系统常量][] 了解更多详情。

回调 API 异步执行所有操作,不会阻塞事件循环,然后在完成或出错时调用回调函数。

回调 API 使用底层的 Node.js 线程池在事件循环线程之外执行文件系统操作。这些操作不是同步的,也不是线程安全的。在对同一文件或数据进行多次并发修改时必须小心,否则可能会导致数据损坏。

fs.access(path, mode?, callback): void
Attributes
path:string | Buffer | URL
mode:integer
默认: fs.constants.F_OK
callback:Function
err:Error

测试用户对 path 指定的文件或目录的权限。mode 参数是一个可选的整数,指定要执行的访问检查。mode 应该是值 fs.constants.F_OK 或由 fs.constants.R_OKfs.constants.W_OKfs.constants.X_OK 中任意一个按位 OR 组成的掩码(例如 fs.constants.W_OK | fs.constants.R_OK)。检查 文件访问常量 以获取 mode 的可能值。

最后一个参数 callback 是一个回调函数,使用可能的错误参数调用。如果任何访问检查失败,错误参数将是一个 Error 对象。以下示例检查 package.json 是否存在,以及是否可读或可写。

import { access, constants } from 'node:fs';

const file = 'package.json';

// 检查文件是否存在于当前目录中。
access(file, constants.F_OK, (err) => {
  console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});

// 检查文件是否可读。
access(file, constants.R_OK, (err) => {
  console.log(`${file} ${err ? 'is not readable' : 'is readable'}`);
});

// 检查文件是否可写。
access(file, constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not writable' : 'is writable'}`);
});

// 检查文件是否可读且可写。
access(file, constants.R_OK | constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`);
});

在调用 fs.open()fs.readFile()fs.writeFile() 之前,不要使用 fs.access() 检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应直接打开/读取/写入文件,并处理文件不可访问时引发的错误。

写入(不推荐)

import { access, open, close } from 'node:fs';

access('myfile', (err) => {
  if (!err) {
    console.error('myfile already exists');
    return;
  }

  open('myfile', 'wx', (err, fd) => {
    if (err) throw err;

    try {
      writeMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

写入(推荐)

import { open, close } from 'node:fs';

open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

读取(不推荐)

import { access, open, close } from 'node:fs';
access('myfile', (err) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  open('myfile', 'r', (err, fd) => {
    if (err) throw err;

    try {
      readMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

读取(推荐)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

上面的“不推荐”示例先检查可访问性然后使用文件;“推荐”示例更好,因为它们直接使用文件并处理错误(如果有)。

通常,仅在文件不会被直接使用时才检查文件的可访问性,例如当其可访问性是来自另一个进程的信号时。

在 Windows 上,目录上的访问控制策略 (ACL) 可能会限制对文件或目录的访问。然而,fs.access() 函数不检查 ACL,因此即使 ACL 限制用户读取或写入,它也可能报告路径是可访问的。

fs.appendFile(path, data, options?, callback): void
Attributes
path:string | Buffer | URL | number
文件名或文件描述符
data:string | Buffer
options:Object | string
encoding:string | null
默认: 'utf8'
mode:integer
默认: 0o666
flag:string
参见 [文件系统 flags 的支持][]。 默认: 'a'
flush:boolean
如果为 true ,则在关闭底层文件描述符之前将其刷新。 默认: false
callback:Function
err:Error

异步将数据追加到文件,如果文件尚不存在则创建该文件。data 可以是字符串或 Buffer

mode 选项仅影响新创建的文件。有关更多详细信息,请参阅 fs.open()

import { appendFile } from 'node:fs';

appendFile('message.txt', 'data to append', (err) => {
  if (err) throw err;
  console.log('“data to append” 已附加到文件!');
});

如果 options 是字符串,则它指定编码:

import { appendFile } from 'node:fs';

appendFile('message.txt', 'data to append', 'utf8', callback);

path 可以指定为已打开用于追加的数字文件描述符(使用 fs.open()fs.openSync())。文件描述符不会自动关闭。

import { open, close, appendFile } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('message.txt', 'a', (err, fd) => {
  if (err) throw err;

  try {
    appendFile(fd, 'data to append', 'utf8', (err) => {
      closeFd(fd);
      if (err) throw err;
    });
  } catch (err) {
    closeFd(fd);
    throw err;
  }
});
fs.chmod(path, mode, callback): void
Attributes
path:string | Buffer | URL
mode:string | integer
callback:Function
err:Error

异步更改文件的权限。除了可能的异常外,不给完成回调传递任何参数。

有关更多详细信息,请参阅 POSIX chmod(2) 文档。

import { chmod } from 'node:fs';

chmod('my_file.txt', 0o775, (err) => {
  if (err) throw err;
  console.log('文件 "my_file.txt" 的权限已更改!');
});

fs.chmod()fs.chmodSync() 方法中使用的 mode 参数是一个数字位掩码,使用以下常量的逻辑 OR 创建:

常量八进制描述
fs.constants.S_IRUSR0o400所有者可读
fs.constants.S_IWUSR0o200所有者可写
fs.constants.S_IXUSR0o100所有者可执行/搜索
fs.constants.S_IRGRP0o40组可读
fs.constants.S_IWGRP0o20组可写
fs.constants.S_IXGRP0o10组可执行/搜索
fs.constants.S_IROTH0o4其他人可读
fs.constants.S_IWOTH0o2其他人可写
fs.constants.S_IXOTH0o1其他人可执行/搜索

构造 mode 的更简单方法是使用三个八进制数字序列(例如 765)。最左边的数字(示例中的 7)指定文件所有者的权限。中间的数字(示例中的 6)指定组的权限。最右边的数字(示例中的 5)指定其他人的权限。

数字描述
7读、写和执行
6读和写
5读和执行
4只读
3写和执行
2只写
1只执行
0无权限

例如,八进制值 0o765 意味着:

  • 所有者可以读、写和执行文件。
  • 组可以读和写文件。
  • 其他人可以读和执行文件。

当在期望文件模式的场合使用原始数字时,任何大于 0o777 的值都可能导致平台特定的行为,这些行为不支持一致地工作。因此,像 S_ISVTXS_ISGIDS_ISUID 这样的常量不在 fs.constants 中暴露。

注意事项:在 Windows 上,只能更改写权限,并且未实现组、所有者或其他人之间权限的区别。

fs.chown(path, uid, gid, callback): void
Attributes
path:string | Buffer | URL
callback:Function
err:Error

异步更改文件的所有者和组。除了可能的异常外,不给完成回调传递任何参数。

有关更多详细信息,请参阅 POSIX chown(2) 文档。

fs.close(fd, callback?): void
Attributes
callback:Function
err:Error

关闭文件描述符。除了可能的异常外,不给完成回调传递任何参数。

对当前通过任何其他 fs 操作使用的任何文件描述符 (fd) 调用 fs.close() 可能会导致未定义的行为。

有关更多详细信息,请参阅 POSIX close(2) 文档。

fs.copyFile(src, dest, mode?, callback): void
Attributes
src:string | Buffer | URL
要复制的源文件名
dest:string | Buffer | URL
复制操作的目标文件名
mode:integer
复制操作的修饰符。 默认: 0
callback:Function
err:Error

异步将 src 复制到 dest。默认情况下,如果 dest 已存在,则会被覆盖。除了可能的异常外,不给回调函数传递任何参数。Node.js 不对复制操作的原子性做出任何保证。如果在为目标文件打开写入后发生错误,Node.js 将尝试删除目标。

mode 是一个可选整数,指定复制操作的行为。可以创建一个由两个或更多值的按位 OR 组成的掩码(例如 fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE)。

  • fs.constants.COPYFILE_EXCL:如果 dest 已存在,则复制操作将失败。
  • fs.constants.COPYFILE_FICLONE:复制操作将尝试创建写时复制 reflink。如果平台不支持写时复制,则使用回退复制机制。
  • fs.constants.COPYFILE_FICLONE_FORCE:复制操作将尝试创建写时复制 reflink。如果平台不支持写时复制,则操作将失败。
import { copyFile, constants } from 'node:fs';

function callback(err) {
  if (err) throw err;
  console.log('source.txt was copied to destination.txt');
}

// 默认情况下,destination.txt 将被创建或覆盖。
copyFile('source.txt', 'destination.txt', callback);

// 通过使用 COPYFILE_EXCL,如果 destination.txt 存在,操作将失败。
copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL, callback);
fs.cp(src, dest, options?, callback): void
Attributes
src:string | URL
要复制的源路径。
dest:string | URL
要复制到的目标路径。
options:Object
dereference:boolean
取消引用符号链接。 默认: false
errorOnExist:boolean
forcefalse 且目标已存在时,抛出错误。 默认: false
filter:Function
用于过滤要复制的文件/目录的函数。返回 true 以复制该项,返回 false 以忽略它。忽略目录时,其所有内容也将被跳过。也可以返回一个 Promise ,其结果为 truefalse默认: undefined
src:string
要复制的源路径。
dest:string
要复制到的目标路径。
force:boolean
覆盖现有文件或目录。如果将其设置为 false 且目标已存在,复制操作将忽略错误。使用 errorOnExist 选项来更改此行为。 默认: true
mode:integer
复制操作的修饰符。 默认: 0 。参见 fs.copyFile()mode 标志。
preserveTimestamps:boolean
当为 true 时,将保留来自 src 的时间戳。 默认: false
recursive:boolean
递归复制目录 默认: false
verbatimSymlinks:boolean
当为 true 时,将跳过符号链接的路径解析。 默认: false
callback:Function
err:Error

异步将整个目录结构(包括子目录和文件)从 src 复制到 dest

将目录复制到另一个目录时,不支持 glob,行为类似于 cp dir1/ dir2/

fs.createReadStream(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
flags:string
参见 [文件系统 flags 的支持][]。 默认: 'r'
encoding:string
默认: null
fd:integer | FileHandle
默认: null
mode:integer
默认: 0o666
autoClose:boolean
默认: true
emitClose:boolean
默认: true
start:integer
默认: Infinity
highWaterMark:integer
默认: 64 * 1024
fs:Object | null
默认: null
signal:AbortSignal | null
默认: null
windowsHandle:bigint
要读取的原始 Win32 HANDLE 值,用它代替 fd 。仅限 Windows。 默认: null

options 可以包括 startend 值,以从文件读取字节范围而不是整个文件。startend 都包含在内,并从 0 开始计数,允许的值在 [0, Number.MAX_SAFE_INTEGER] 范围内。如果指定了 fd 且省略了 start 或为 undefinedfs.createReadStream() 将从当前文件位置顺序读取。encoding 可以是 Buffer 接受的任何值。

如果指定了 fdReadStream 将忽略 path 参数并使用指定的文件描述符。这意味着不会发出 'open' 事件。fd 应该是阻塞的;非阻塞 fd 应传递给 net.Socket

如果 fd 指向仅支持阻塞读取的字符设备(例如键盘或声卡),则读取操作直到数据可用时才完成。这可能会阻止进程退出并且流无法自然关闭。

在 Windows 上,传入 fd 的值会被解释为 CRT 文件描述符。若要改用原始 Win32 HANDLE,例如从其他进程获取的继承匿名管道句柄,请将其作为 windowsHandle 传入。该句柄会被封装在一个由流拥有并关闭的文件描述符中。windowsHandle 选项在非 Windows 平台上会抛出异常,并且不能与 fs 选项结合使用。

默认情况下,流在销毁后会发出 'close' 事件。将 emitClose 选项设置为 false 可更改此行为。

通过提供 fs 选项,可以覆盖 openreadclose 的相应 fs 实现。提供 fs 选项时,需要覆盖 read。如果未提供 fd,还需要覆盖 open。如果 autoClosetrue,还需要覆盖 close

import { createReadStream } from 'node:fs';

// 从某个字符设备创建流。
const stream = createReadStream('/dev/input/event0');
setTimeout(() => {
  stream.close(); // 这可能不会关闭流。
  // 人为地标记流结束,就像底层资源本身指示文件结束一样,允许流关闭。
  // 这不会取消待处理的读取操作,如果有这样的操作,进程可能仍然无法成功退出
  // 直到它完成。
  stream.push(null);
  stream.read(0);
}, 100);

如果 autoClose 为 false,则即使有错误,文件描述符也不会关闭。应用程序有责任关闭它并确保没有文件描述符泄漏。如果 autoClose 设置为 true(默认行为),则在 'error''end' 时文件描述符将自动关闭。

mode 设置文件模式(权限和粘滞位),但仅在创建文件时生效。

读取一个 100 字节长的文件的最后 10 字节的示例:

import { createReadStream } from 'node:fs';

createReadStream('sample.txt', { start: 90, end: 99 });

如果 options 是字符串,则它指定编码。

fs.createWriteStream(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
flags:string
参见 [文件系统 flags 的支持][]。 默认: 'w'
encoding:string
默认: 'utf8'
fd:integer | FileHandle
默认: null
mode:integer
默认: 0o666
autoClose:boolean
默认: true
emitClose:boolean
默认: true
start:integer
fs:Object | null
默认: null
signal:AbortSignal | null
默认: null
highWaterMark:number
flush:boolean
如果为 true ,底层文件描述符将在关闭前刷新。 默认: false
windowsHandle:bigint
要写入的原始 Win32 HANDLE 值,用于替代 fd 。仅限 Windows。 默认: null

options 还可以包括 start 选项,以允许在文件开头之后的某个位置写入数据,允许的值在 [0, Number.MAX_SAFE_INTEGER] 范围内。修改文件而不是替换它可能需要将 flags 选项设置为 r+ 而不是默认的 wencoding 可以是 Buffer 接受的任何值。

如果 autoClose 设置为 true(默认行为),则在 'error''finish' 时文件描述符将自动关闭。如果 autoClose 为 false,则即使有错误,文件描述符也不会关闭。应用程序有责任关闭它并确保没有文件描述符泄漏。

在 Windows 上,传入 fd 的值将被解释为 CRT 文件描述符。若要改用原始 Win32 HANDLE,例如使用从其他进程获取的继承匿名管道句柄,请将其作为 windowsHandle 传入。该句柄会被包装在一个由流拥有并关闭的文件描述符中。windowsHandle 选项在非 Windows 平台上会抛出异常,并且不能与 fs 选项结合使用。

默认情况下,流在销毁后会触发 'close' 事件。将 emitClose 选项设置为 false 可更改此行为。

通过提供 fs 选项,可以覆盖 openwritewritevclose 的相应 fs 实现。在不使用 writev() 的情况下覆盖 write() 可能会降低性能,因为某些优化 (_writev()) 将被禁用。提供 fs 选项时,需要至少覆盖 writewritev 之一。如果未提供 fd 选项,还需要覆盖 open。如果 autoClosetrue,还需要覆盖 close

fs.ReadStream 一样,如果指定了 fdfs.WriteStream 将忽略 path 参数并使用指定的文件描述符。这意味着不会发出 'open' 事件。fd 应该是阻塞的;非阻塞 fd 应传递给 net.Socket

如果 options 是字符串,则它指定编码。

fs.exists(path, callback): void

稳定性:0 - 已弃用:改用 fs.stat()fs.access()

Attributes
path:string | Buffer | URL
callback:Function
exists:boolean

通过检查文件系统测试给定 path 处的元素是否存在。然后使用 true 或 false 调用 callback 参数:

import { exists } from 'node:fs';

exists('/etc/passwd', (e) => {
  console.log(e ? 'it exists' : 'no passwd!');
});

此回调的参数与其他 Node.js 回调不一致。 通常,Node.js 回调的第一个参数是 err 参数,后面才跟其他参数。fs.exists() 回调只有一个布尔参数。这是推荐使用 fs.access() 而不是 fs.exists() 的原因之一。

如果 path 是符号链接,则会被跟随。因此,如果 path 存在但指向不存在的元素,回调将接收值 false

不建议在调用 fs.open()fs.readFile()fs.writeFile() 之前使用 fs.exists() 检查文件是否存在。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件状态。相反,用户代码应直接打开、读取或写入文件,并处理文件不存在时引发的错误。

写入(不推荐)

import { exists, open, close } from 'node:fs';

exists('myfile', (e) => {
  if (e) {
    console.error('myfile already exists');
  } else {
    open('myfile', 'wx', (err, fd) => {
      if (err) throw err;

      try {
        writeMyData(fd);
      } finally {
        close(fd, (err) => {
          if (err) throw err;
        });
      }
    });
  }
});

写入(推荐)

import { open, close } from 'node:fs';
open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

读取(不推荐)

import { open, close, exists } from 'node:fs';

exists('myfile', (e) => {
  if (e) {
    open('myfile', 'r', (err, fd) => {
      if (err) throw err;

      try {
        readMyData(fd);
      } finally {
        close(fd, (err) => {
          if (err) throw err;
        });
      }
    });
  } else {
    console.error('myfile does not exist');
  }
});

读取(推荐)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

上面的“不推荐”示例先检查存在性然后使用文件;“推荐”示例更好,因为它们直接使用文件并处理错误(如果有)。

通常,仅在文件不会被直接使用时才检查文件的存在性,例如当其存在性是来自另一个进程的信号时。

fs.fchmod(fd, mode, callback): void
Attributes
mode:string | integer
callback:Function
err:Error

设置文件上的权限。除了可能的异常外,不给完成回调传递任何参数。

有关更多详细信息,请参阅 POSIX fchmod(2) 文档。

fs.fchown(fd, uid, gid, callback): void
Attributes
callback:Function
err:Error

设置文件的所有者。除了可能的异常外,不给完成回调传递任何参数。

有关更多详细信息,请参阅 POSIX fchown(2) 文档。

fs.fdatasync(fd, callback): void
Attributes
callback:Function
err:Error

强制所有当前与该文件关联的排队 I/O 操作进入操作系统的同步 I/O 完成状态。有关详细信息,请参阅 POSIX fdatasync(2) 文档。除了可能的异常外,不给完成回调传递任何参数。

fs.fstat(fd, options?, callback): void
Attributes
options:Object
bigint:boolean
返回的 fs.Stats 对象中的数值是否应为 bigint默认: false
callback:Function
err:Error
stats:fs.Stats

使用文件描述符的 fs.Stats 调用回调。

有关更多详细信息,请参阅 POSIX fstat(2) 文档。

fs.fsync(fd, callback): void
Attributes
callback:Function
err:Error

请求将打开文件描述符的所有数据刷新到存储设备。具体实现取决于操作系统和设备。有关更多详细信息,请参阅 POSIX fsync(2) 文档。除了可能的异常外,不给完成回调传递任何参数。

fs.ftruncate(fd, len?, callback): void
Attributes
默认: 0
callback:Function
err:Error

截断文件描述符。除了可能的异常外,不给完成回调传递任何参数。

有关更多详细信息,请参阅 POSIX ftruncate(2) 文档。

如果文件描述符引用的文件大于 len 字节,则文件中只保留前 len 字节。

例如,以下程序仅保留文件的前四个字节:

import { open, close, ftruncate } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('temp.txt', 'r+', (err, fd) => {
  if (err) throw err;

  try {
    ftruncate(fd, 4, (err) => {
      closeFd(fd);
      if (err) throw err;
    });
  } catch (err) {
    closeFd(fd);
    if (err) throw err;
  }
});

如果文件以前短于 len 字节,则它会扩展,扩展部分填充空字节 ('\0'):

如果 len 为负数,则将使用 0

fs.futimes(fd, atime, mtime, callback): void
Attributes
atime:number | string | Date
mtime:number | string | Date
callback:Function
err:Error

更改由提供的文件描述符引用的对象的文件系统时间戳。参见 fs.utimes()

fs.glob(pattern, options?, callback): void
Attributes
pattern:string | string[]
options:Object
cwd:string | URL
当前工作目录。 默认: process.cwd()
exclude:Function | string[]
用于过滤文件/目录的函数,或 要排除的 glob 模式列表。如果提供函数,返回 true 以排除该项, false 以包含它。 默认: undefined
followSymlinks:boolean
当为 true 时,在展开 ** 模式时会跟随指向目录的符号链接。 默认: false
withFileTypes:boolean
如果 glob 应将路径作为 Dirent 返回则为 true ,否则为 false默认: false
callback:Function
err:Error

当启用 followSymlinks 时,检测到的符号链接循环不会被递归遍历。

import { glob } from 'node:fs';

glob('**/*.js', (err, matches) => {
  if (err) throw err;
  console.log(matches);
});
const { glob } = require('node:fs');

glob('**/*.js', (err, matches) => {
  if (err) throw err;
  console.log(matches);
});
fs.lchmod(path, mode, callback): void

稳定性:0 - 已弃用

Attributes
path:string | Buffer | URL
mode:integer
callback:Function
err:Error | AggregateError

更改符号链接上的权限。除了可能的异常外,不会向完成回调传递任何参数。

此方法仅在 macOS 上实现。

有关更多详细信息,请参阅 POSIX lchmod(2) 文档。

fs.lchown(path, uid, gid, callback): void
Attributes
path:string | Buffer | URL
callback:Function
err:Error

设置符号链接的所有者。除了可能的异常外,不会向完成回调传递任何参数。

有关更多详细信息,请参阅 POSIX lchown(2) 文档。

fs.lutimes(path, atime, mtime, callback): void
Attributes
path:string | Buffer | URL
atime:number | string | Date
mtime:number | string | Date
callback:Function
err:Error

以与 fs.utimes() 相同的方式更改文件的访问时间和修改时间,不同之处在于,如果路径引用的是符号链接,则不会解引用该链接;相反,会更改符号链接本身的时间戳。

除非发生异常,否则不会向完成回调传递任何参数。

fs.link(existingPath, newPath, callback): void
Attributes
existingPath:string | Buffer | URL
newPath:string | Buffer | URL
callback:Function
err:Error

创建从 existingPathnewPath 的新链接。有关更多详细信息,请参阅 POSIX link(2) 文档。除了可能的异常外,不会向完成回调传递任何参数。

fs.lstat(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.Stats 对象中的数值是否应为 bigint默认: false
callback:Function
err:Error
stats:fs.Stats

检索路径引用的符号链接的 fs.Stats。回调获取两个参数 (err, stats),其中 stats 是一个 fs.Stats 对象。lstat()stat() 相同,只不过如果 path 是符号链接,则统计的是链接本身,而不是它引用的文件。

有关更多详细信息,请参阅 POSIX lstat(2) 文档。

fs.mkdir(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:Object | integer
recursive:boolean
默认值: false
mode:string | integer
在 Windows 上不支持。参见 文件模式 了解更多详情。 默认值: 0o777
callback:Function
err:Error
path:string | undefined
仅当目录被创建且 recursive 设置为 true 时存在。

异步创建一个目录。

回调会接收一个可能的异常,并且如果 recursivetrue,则接收 第一个创建的目录路径,(err[, path])。 当 recursivetrue 时,如果没有创建目录(例如,如果它之前已创建), path 仍然可以是 undefined

可选的 options 参数可以是一个指定 mode(权限和粘滞位)的整数, 或者是一个带有 mode 属性和一个 recursive 属性的对象, 指示是否应创建父目录。当 path 是一个已存在的目录时调用 fs.mkdir() 仅在 recursive 为 false 时导致错误。如果 recursive 为 false 且目录存在,则发生 EEXIST 错误。

import { mkdir } from 'node:fs';

// 创建 ./tmp/a/apple,无论 ./tmp 和 ./tmp/a 是否存在。
mkdir('./tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

在 Windows 上,即使在根目录上使用递归使用 fs.mkdir() 也会 导致错误:

import { mkdir } from 'node:fs';

mkdir('/', { recursive: true }, (err) => {
  // => [Error: EPERM: 操作不允许,mkdir 'C:\']
});

有关更多详细信息,请参阅 POSIX mkdir(2) 文档。

fs.mkdtemp(prefix, options?, callback): void
Attributes
prefix:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'
callback:Function
err:Error
directory:string

创建一个唯一的临时目录。

生成六个随机字符附加到必需的 prefix 后面以创建一个唯一的临时目录。由于平台 不一致,避免在 prefix 中使用尾随的 X 字符。某些平台, 特别是 BSD,可以返回超过六个随机字符,并用随机字符替换 prefix 中的尾随 X 字符。

创建的目录路径作为字符串传递给回调的第二个 参数。

可选的 options 参数可以是一个指定编码的字符串,或者是一个 带有 encoding 属性的对象,指定要使用的字符编码。

import { mkdtemp } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';

mkdtemp(join(tmpdir(), 'foo-'), (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // 打印:/tmp/foo-itXde2 或 C:\Users\...\AppData\Local\Temp\foo-itXde2
});

fs.mkdtemp() 方法会将六个随机选择的字符 直接附加到 prefix 字符串。例如,给定一个目录 /tmp,如果 意图是创建一个 /tmp 的临时目录,则 prefix 必须以尾随的平台特定路径分隔符 (require('node:path').sep)结束。

import { tmpdir } from 'node:os';
import { mkdtemp } from 'node:fs';

// 新临时目录的父目录
const tmpDir = tmpdir();

// 此方法 *不正确*:
mkdtemp(tmpDir, (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // 将打印类似 `/tmpabc123` 的内容。
  // 一个新的临时目录被创建在文件系统根目录
  // 而不是 *在* /tmp 目录 *内*。
});

// 此方法 *正确*:
import { sep } from 'node:path';
mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // 将打印类似 `/tmp/abc123` 的内容。
  // 一个新的临时目录被创建在
  // /tmp 目录内。
});
fs.open(path, flags?, mode?, callback): void
Attributes
path:string | Buffer | URL
flags:string | number
参见 [文件系统 flags 的支持][]。 默认值: 'r'
mode:string | integer
默认值: 0o666 (可读和可写)
callback:Function

异步打开文件。有关更多详细信息,请参阅 POSIX open(2) 文档。

mode 设置文件模式(权限和粘滞位),但仅在文件被 创建时。在 Windows 上,只能操作写权限;参见 fs.chmod()

回调获取两个参数 (err, fd)

某些字符(< > : " / \ | ? *)在 Windows 下被保留,如 命名文件、路径和命名空间 所述。在 NTFS 下,如果文件名包含 冒号,Node.js 将打开一个文件系统流,如 此 MSDN 页面 所述。

基于 fs.open() 的函数也表现出这种行为: fs.writeFile()fs.readFile() 等。

fs.openAsBlob(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
type:string
Blob 的可选 MIME 类型。

返回一个 Blob,其数据由给定文件支持。

创建 Blob 后不得修改文件。任何修改 都会导致读取 Blob 数据失败并抛出 DOMException 错误。 在创建 Blob 时以及每次读取之前对文件进行同步 stat 操作, 以检测文件数据是否已在磁盘上被修改。

import { openAsBlob } from 'node:fs';

const blob = await openAsBlob('the.file.txt');
const ab = await blob.arrayBuffer();
blob.stream();
const { openAsBlob } = require('node:fs');

(async () => {
  const blob = await openAsBlob('the.file.txt');
  const ab = await blob.arrayBuffer();
  blob.stream();
})();
fs.opendir(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:Object
encoding:string | null
默认值: 'utf8'
bufferSize:number
从目录读取时内部缓冲的目录条目数。 较高的值会带来更好的性能,但也会占用更多内存。 默认值: 32
recursive:boolean
默认值: false
callback:Function
err:Error
dir:fs.Dir

异步打开一个目录。有关更多详细信息,请参阅 POSIX opendir(3) 文档。

创建一个 fs.Dir,其中包含所有用于读取和 清理目录的后续函数。

encoding 选项设置打开目录以及后续读取操作时 path 的编码。

fs.read(fd, buffer, offset, length, position, callback): void
Attributes
buffer:Buffer | TypedArray | DataView
数据将被 写入的缓冲区。
offset:integer
buffer 中写入数据的位置。
length:integer
要读取的字节数。
position:integer | bigint | null
指定从文件中 何处开始读取。如果 positionnull-1 ,数据将从当前 文件位置读取,并且文件位置将被更新。如果 position 是 非负整数,文件位置将保持不变。
callback:Function
err:Error
bytesRead:integer
buffer:Buffer

fd 指定的文件读取数据。

回调被给予三个参数,(err, bytesRead, buffer)

如果文件未并发修改,当读取的字节数为零时到达文件末尾。

如果此方法作为其 util.promisify() 版本调用,它返回 一个带有 bytesReadbuffer 属性的对象的 Promise。

fs.read() 方法从文件描述符 (fd) 指定的 文件读取数据。 length 参数指示 Node.js 将尝试从内核读取的最大字节数。 但是,实际读取的字节数 (bytesRead) 可能低于 指定的 length,原因有多种。

例如:

  • 如果文件短于指定的 lengthbytesRead 将设置为实际读取的字节数。
  • 如果文件在缓冲区填满之前遇到 EOF(文件末尾), Node.js 将读取所有可用字节直到遇到 EOF, 并且回调中的 bytesRead 参数将指示 实际读取的字节数,这可能小于指定的 length
  • 如果文件位于慢速网络文件系统上 或在读取期间遇到任何其他问题, bytesRead 可能低于指定的 length

因此,使用 fs.read() 时,重要的是 检查 bytesRead 值以 确定实际从文件读取了多少字节。 取决于你的应用程序 逻辑,你可能需要处理 bytesRead 低于指定 length 的情况, 例如,如果你需要 最小量的字节,则将读取调用包装在循环中。

此行为类似于 POSIX preadv2 函数。

fs.read(fd, options?, callback): void
Attributes
options:Object
buffer:Buffer | TypedArray | DataView
默认值: Buffer.alloc(16384)
offset:integer
默认值: 0
length:integer
默认值: buffer.byteLength - offset
position:integer | bigint | null
默认值: null
callback:Function
err:Error
bytesRead:integer
buffer:Buffer

fs.read() 函数类似,此版本接受一个可选的 options 对象。如果未指定 options 对象,它将默认使用上述 值。

M

fs.read

History
fs.read(fd, buffer, options?, callback): void
Attributes
buffer:Buffer | TypedArray | DataView
要写入数据的缓冲区。
options:Object
offset:integer
默认值: 0
length:integer
默认值: buffer.byteLength - offset
position:integer | bigint
默认值: null
callback:Function
err:Error
bytesRead:integer
buffer:Buffer

fs.read() 函数类似,此版本接受一个可选的 options 对象。如果未指定 options 对象,则默认使用上述 值。

fs.readdir(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'
withFileTypes:boolean
默认值: false
recursive:boolean
如果为 true ,递归读取目录的内容。 在递归模式下,它将列出所有文件、子文件和 目录。 默认值: false
callback:Function
err:Error
files:string[] | Buffer[] | fs.Dirent[]

读取目录的内容。回调获取两个参数 (err, files), 其中 files 是目录中文件名的数组,不包括 '.''..'

有关更多详细信息,请参阅 POSIX readdir(3) 文档。

可选的 options 参数可以是一个指定编码的字符串,或者是一个 带有 encoding 属性的对象,指定要用于 传递给回调的文件名的字符编码。如果 encoding 设置为 'buffer', 返回的文件名将作为 Buffer 对象传递。

如果 options.withFileTypes 设置为 truefiles 数组将包含 fs.Dirent 对象。

fs.readFile(path, options?, callback): void
Attributes
path:string | Buffer | URL | integer
文件名或文件描述符
options:Object | string
encoding:string | null
默认值: null
flag:string
参见 [文件系统 flags 的支持][]. 默认值: 'r' .
允许中止正在进行的 readFile
buffer:Buffer | TypedArray | DataView | Function
用于读入数据的缓冲区,或者一个 以文件大小为参数并返回该缓冲区的函数。
callback:Function
err:Error | AggregateError
data:string | Buffer

异步读取文件的全部内容。

import { readFile } from 'node:fs';

readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});

回调会接收两个参数 (err, data),其中 data 是 文件的内容。

如果未指定编码,则返回原始缓冲区。

如果提供了 buffer 且未指定编码,则返回的 Buffer 是 所提供缓冲区的视图,其中只包含已读取的字节。如果所提供的缓冲区太小, 无法容纳整个文件,则回调会在出错时被调用。

如果 options 是一个字符串,则它指定编码:

import { readFile } from 'node:fs';

readFile('/etc/passwd', 'utf8', callback);

当路径是目录时,fs.readFile()fs.readFileSync() 的行为取决于平台。在 macOS、Linux 和 Windows 上, 将返回错误。在 FreeBSD 上,将返回目录内容的 表示。

import { readFile } from 'node:fs';

// macOS、Linux 和 Windows
readFile('<directory>', (err, data) => {
  // => [Error: EISDIR: 对目录执行了非法操作,read <directory>]
});

//  FreeBSD
readFile('<directory>', (err, data) => {
  // => null, <data>
});

可以使用 AbortSignal 中止正在进行的请求。如果 请求被中止,回调将使用 AbortError 调用:

import { readFile } from 'node:fs';

const controller = new AbortController();
const signal = controller.signal;
readFile(fileInfo[0].name, { signal }, (err, buf) => {
  // ...
});
// 当你想要中止请求时
controller.abort();

fs.readFile() 函数会缓冲整个文件。为了尽量降低内存成本, 在可能的情况下,最好通过 fs.createReadStream() 进行流式传输。

中止正在进行的请求不会中止单个操作系统 请求,而是中止 fs.readFile 执行的内部缓冲操作。

使用带有预分配缓冲区的 buffer 选项的示例:

import { Buffer } from 'node:buffer';
import { readFile } from 'node:fs';

const buf = Buffer.alloc(16384);
readFile('/path/to/file', { buffer: buf }, (err, data) => {
  if (err) throw err;
  console.log(data); // 仅包含已读取字节的 `buf` 视图
});

使用 buffer 选项和返回缓冲区的函数的示例:

import { Buffer } from 'node:buffer';
import { readFile } from 'node:fs';

readFile('/path/to/file', {
  buffer: (size) => Buffer.alloc(size),
}, (err, data) => {
  if (err) throw err;
  console.log(data);
});
  1. 任何指定的文件描述符都必须支持读取。
  2. 如果将文件描述符指定为 path,则不会自动关闭它。
  3. 读取将从当前位置开始。例如,如果文件 已经有 'Hello World',并且使用文件描述符读取了六个字节, 则使用相同文件描述符调用 fs.readFile() 将得到 'World',而不是 'Hello World'

fs.readFile() 方法会异步地将文件内容一次读入一个块 内存,允许事件循环在每个块之间运行。 这使读取操作对可能使用底层 libuv 线程池的其他活动 影响较小,但意味着将文件完整读入内存需要更长的 时间。

额外的读取开销在不同系统上可能差异很大,并取决于 所读取的文件类型。如果文件类型不是普通文件(例如管道) 且 Node.js 无法确定实际文件大小,则每次读取 操作将加载 64 KiB 的数据。对于普通文件,每次读取将处理 512 KiB 的数据。

对于需要尽可能快地读取文件内容的应用程序, 最好直接使用 fs.read(),并由应用程序代码管理 文件的全部读取内容。

Node.js GitHub issue #25741 提供了更多信息,以及对 不同 Node.js 版本中多个文件大小下 fs.readFile() 性能的详细 分析。

fs.readlink(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'
callback:Function
err:Error
linkString:string | Buffer

读取 path 引用的符号链接的内容。回调获取 两个参数 (err, linkString)

有关更多详细信息,请参阅 POSIX readlink(2) 文档。

可选的 options 参数可以是一个指定编码的字符串,或者是一个 带有 encoding 属性的对象,指定要用于 传递给回调的链接路径的字符编码。如果 encoding 设置为 'buffer', 返回的链接路径将作为 Buffer 对象传递。

fs.readv(fd, buffers, position?, callback): void
Attributes
buffers:ArrayBufferView[]
position:integer | null
默认值: null
callback:Function
err:Error
bytesRead:integer
buffers:ArrayBufferView[]

fd 指定的文件读取,并使用 readv() 写入到 ArrayBufferView 数组中。

position 是从文件开头算起的数据应读取的偏移量。如果 typeof position !== 'number',数据将从当前位置读取。

回调将被赋予三个参数:errbytesReadbuffersbytesRead 是从文件读取的字节数。

如果此方法作为其 util.promisify() 版本调用,它返回一个带有 bytesReadbuffers 属性的对象的 promise。

fs.realpath(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding?:string
Default: 'utf8'
callback:Function
err:Error
resolvedPath:string | Buffer

Asynchronously computes the canonical pathname by resolving ., .., and symbolic links.

Canonical pathnames are not necessarily unique. Hard links and bind mounts can expose file system entities through many pathnames.

This function behaves similarly to realpath(3), with some exceptions:

  1. Case conversion is not performed on case-insensitive file systems.

  2. The maximum number of symbolic links is platform-independent and is typically (far) higher than the number supported by the native realpath(3) implementation.

callback is passed two arguments (err, resolvedPath). Relative paths can be resolved using process.cwd.

Only paths that can be converted to UTF8 strings are supported.

The optional options parameter can be a string specifying an encoding, or an object with an encoding property specifying the character encoding to use for the path passed to the callback. If encoding is set to 'buffer', the returned path will be passed as a Buffer object.

If path resolves to a socket or pipe, the function will return the system-dependent name of that object.

Nonexistent paths result in an ENOENT error. error.path is the absolute file path.

fs.realpath.native(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认值: 'utf8'
callback:Function
err:Error
resolvedPath:string | Buffer

异步 realpath(3)

callback 获取两个参数 (err, resolvedPath)

仅支持可以转换为 UTF8 字符串的路径。

可选的 options 参数可以是一个指定编码的字符串,或者是一个带有 encoding 属性的对象,指定要用于传递给回调的路径的字符编码。如果 encoding 设置为 'buffer',返回的路径将作为 Buffer 对象传递。

在 Linux 上,当 Node.js 链接到 musl libc 时,procfs 文件系统必须挂载在 /proc 上以便此函数工作。Glibc 没有此限制。

fs.rename(oldPath, newPath, callback): void
Attributes
oldPath:string | Buffer | URL
newPath:string | Buffer | URL
callback:Function
err:Error

异步将 oldPath 处的文件重命名为提供的 newPath 路径名。如果 newPath 已存在,它将被覆盖。如果 newPath 处有一个目录,则将引发错误。除了可能的异常外,没有参数被给予完成回调。

另请参见:rename(2)

import { rename } from 'node:fs';

rename('oldFile.txt', 'newFile.txt', (err) => {
  if (err) throw err;
  console.log('重命名完成!');
});
M

fs.rmdir

fs.rmdir(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:Object
目前没有暴露选项。过去有 recursivemaxBusyTriesemfileWait 的选项,但它们已弃用并移除。 options 参数仍被接受以向后兼容,但它未被使用。
callback:Function
err:Error

异步 rmdir(2)。除了可能的异常外,没有参数被给予完成回调。

在文件(不是目录)上使用 fs.rmdir() 在 Windows 上导致 ENOENT 错误,在 POSIX 上导致 ENOTDIR 错误。

要获得类似 rm -rf Unix 命令的行为,使用 fs.rm() 并带有选项 { recursive: true, force: true }

fs.rm(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:Object
force:boolean
当为 true 时,如果 path 不存在,异常将被忽略。 默认值: false
maxRetries:integer
如果遇到 EBUSYEMFILEENFILEENOTEMPTYEPERM 错误,Node.js 将重试操作,每次尝试线性后退等待 retryDelay 毫秒。此选项表示重试次数。如果 recursive 选项不为 true ,则忽略此选项。 默认值: 0
recursive:boolean
如果为 true ,执行递归移除。在递归模式下,操作失败时会重试。 默认值: false
retryDelay:integer
重试之间等待的毫秒数。如果 recursive 选项不为 true ,则忽略此选项。 默认值: 100
callback:Function
err:Error

异步移除文件和目录(基于标准 POSIX rm 实用程序建模)。除了可能的异常外,没有参数被给予完成回调。

fs.stat(path, options?, callback): void
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.Stats 对象中的数值是否应为 bigint默认值: false
throwIfNoEntry:boolean
如果没有文件系统条目存在,是否抛出异常,而不是返回 undefined默认值: true
callback:Function
err:Error
stats:fs.Stats

异步 stat(2)。回调获取两个参数 (err, stats),其中 stats 是一个 fs.Stats 对象。

在错误的情况下,err.code 将是 常见系统错误 之一。

fs.stat() 跟随符号链接。使用 fs.lstat() 查看链接本身。

不建议在调用 fs.open()fs.readFile()fs.writeFile() 之前使用 fs.stat() 检查文件是否存在。相反,用户代码应直接打开/读取/写入文件并处理如果文件不可用时引发的错误。

要检查文件是否存在而不随后操作它,推荐 fs.access()

例如,给定以下目录结构:

- txtDir
-- file.txt
- app.js

下一个程序将检查给定路径的 stats:

import { stat } from 'node:fs';

const pathsToCheck = ['./txtDir', './txtDir/file.txt'];

for (let i = 0; i < pathsToCheck.length; i++) {
  stat(pathsToCheck[i], (err, stats) => {
    console.log(stats.isDirectory());
    console.log(stats);
  });
}

结果输出将类似于:

true
Stats {
  dev: 16777220,
  mode: 16877,
  nlink: 3,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 14214262,
  size: 96,
  blocks: 0,
  atimeMs: 1561174653071.963,
  mtimeMs: 1561174614583.3518,
  ctimeMs: 1561174626623.5366,
  birthtimeMs: 1561174126937.2893,
  atime: 2019-06-22T03:37:33.072Z,
  mtime: 2019-06-22T03:36:54.583Z,
  ctime: 2019-06-22T03:37:06.624Z,
  birthtime: 2019-06-22T03:28:46.937Z,
  atimeInstant: 2019-06-22T03:37:33.071963Z,
  mtimeInstant: 2019-06-22T03:36:54.5833518Z,
  ctimeInstant: 2019-06-22T03:37:06.6235366Z,
  birthtimeInstant: 2019-06-22T03:28:46.9372893Z
}
false
Stats {
  dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 14214074,
  size: 8,
  blocks: 8,
  atimeMs: 1561174616618.8555,
  mtimeMs: 1561174614584,
  ctimeMs: 1561174614583.8145,
  birthtimeMs: 1561174007710.7478,
  atime: 2019-06-22T03:36:56.619Z,
  mtime: 2019-06-22T03:36:54.584Z,
  ctime: 2019-06-22T03:36:54.584Z,
  birthtime: 2019-06-22T03:26:47.711Z,
  atimeInstant: 2019-06-22T03:36:56.6188555Z,
  mtimeInstant: 2019-06-22T03:36:54.584Z,
  ctimeInstant: 2019-06-22T03:36:54.5838145Z,
  birthtimeInstant: 2019-06-22T03:26:47.7107478Z
}

文件系统状态统计

History
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.StatFs 对象中的数值是否应为 bigint默认值: false
callback:Function
err:Error
stats:fs.StatFs

异步 statfs(2)。返回有关包含 path 的挂载文件系统的信息。回调获取两个参数 (err, stats),其中 stats 是一个 fs.StatFs 对象。

在错误的情况下,err.code 将是 常见系统错误 之一。

Attributes
target:string | Buffer | URL
path:string | Buffer | URL
type:string | null
默认值: null
callback:Function
err:Error

创建称为 path 的链接指向 target。除了可能的异常外,没有参数被给予完成回调。

有关更多详细信息,请参阅 POSIX symlink(2) 文档。

type 参数仅在 Windows 上可用,在其他平台上被忽略。它可以设置为 'dir''file''junction'。如果 type 参数是 null,Node.js 将自动检测 target 类型并使用 'file''dir'。如果 target 不存在,将使用 'file'。Windows 连接点要求目标路径为绝对路径。当使用 'junction' 时,target 参数将自动规范化为绝对路径。NTFS 卷上的连接点只能指向目录。

相对目标是相对于链接的父目录。

import { symlink } from 'node:fs';

symlink('./mew', './mewtwo', callback);

上面的示例创建一个符号链接 mewtwo 指向同一目录中的 mew

$ tree .
.
├── mew
└── mewtwo -> ./mew
fs.truncate(path, len?, callback): void
Attributes
path:string | Buffer | URL
默认值: 0
callback:Function
err:Error | AggregateError

截断文件。除了可能的异常外,不会向完成回调传递任何参数。文件描述符也可以作为第一个参数传递。在这种情况下,将调用 fs.ftruncate()

import { truncate } from 'node:fs';
// 假设 'path/file.txt' 是一个普通文件。
truncate('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt 已被截断');
});
const { truncate } = require('node:fs');
// 假设 'path/file.txt' 是一个普通文件。
truncate('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt 已被截断');
});

传递文件描述符已弃用,并可能导致在未来抛出错误。

有关更多详细信息,请参阅 POSIX truncate(2) 文档。

fs.unlink(path, callback): void
Attributes
path:string | Buffer | URL
callback:Function
err:Error

异步移除文件或符号链接。除了可能的异常外,没有参数会传递给完成回调。

import { unlink } from 'node:fs';
// 假设 'path/file.txt' 是一个普通文件。
unlink('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was deleted');
});

fs.unlink() 不适用于目录,无论是否为空。要移除目录,请使用 fs.rmdir()

有关更多详细信息,请参阅 POSIX unlink(2) 文档。

M

fs.unwatchFile

History
fs.unwatchFile(filename, listener?): void
Attributes
filename:string | Buffer | URL
listener:Function
可选,之前使用 fs.watchFile() 附加的监听器

停止监视 filename 的更改。如果指定了 listener,仅移除该特定监听器。否则,所有 监听器都会被移除,从而有效地停止监视 filename

使用未被监视的 filename 调用 fs.unwatchFile() 是无操作,不会报错。

使用 fs.watch() 比使用 fs.watchFile()fs.unwatchFile() 更高效。可能时应使用 fs.watch() 代替 fs.watchFile()fs.unwatchFile()

fs.utimes(path, atime, mtime, callback): void
Attributes
path:string | Buffer | URL
atime:number | string | Date
mtime:number | string | Date
callback:Function
err:Error

更改 path 引用的对象的文件系统时间戳。

atimemtime 参数遵循以下规则:

  • 值可以是表示 Unix 纪元时间(秒)的数字、Date,或数字字符串如 '123456789.0'
  • 如果值无法转换为数字,或是 NaNInfinity-Infinity,将抛出 Error
fs.watch(filename, options?, listener?): void
Attributes
filename:string | Buffer | URL
options:string | Object
persistent:boolean
表示只要文件被监视,进程就应继续运行。 默认值: true
recursive:boolean
表示是否应监视所有子目录,还是仅监视当前目录。这适用于指定目录时,并且仅在受支持的平台上有效(参见 [caveats][])。 默认值: false
encoding:string
指定传递给监听器的文件名所使用的字符编码。 默认值: 'utf8'
允许使用 AbortSignal 关闭 watcher。
throwIfNoEntry:boolean
表示当路径不存在时是否应抛出异常。 默认值: true
ignore:string | RegExp | Function | Array
要忽略的模式。字符串是 glob 模式(使用 minimatch ),RegExp 模式会针对文件名测试,而函数会接收文件名并返回 true 以忽略。 默认值: undefined
listener:Function | undefined
默认值: undefined
eventType:string
filename:string | Buffer | null

监视 filename 的更改,其中 filename 是文件或目录。

第二个参数是可选的。如果 options 作为字符串提供,它指定 encoding。否则 options 应作为对象传递。

监听器回调获取两个参数 (eventType, filename)eventType'rename''change'filename 是触发事件的文件名。

在大多数平台上,每当文件名出现在目录中或从目录中消失时,都会发出 'rename' 事件。

监听器回调附加到由 fs.FSWatcher 触发的 'change' 事件,但这与 eventType'change' 值不同。

如果传入了 signal,中止对应的 AbortController 将关闭返回的 fs.FSWatcher

fs.watch API 跨平台并非 100% 一致,并且在某些情况下不可用。

在 Windows 上,如果被监视的目录被移动或重命名,不会发出任何事件。当被监视的目录被删除时,会报告 EPERM 错误。

fs.watch API 不提供任何针对文件系统恶意操作的保护。例如,在 Windows 上,它是通过监视目录中的变化而不是特定文件来实现的。这允许替换文件,并且 fs 会报告具有相同文件名的新文件的变化。

此功能依赖于底层操作系统提供某种方式来通知文件系统的变化。

  • 在 Linux 系统上,这使用 inotify(7)
  • 在 BSD 系统上,这使用 kqueue(2)
  • 在 macOS 上,这使用 kqueue(2) 监视文件,使用 FSEvents 监视目录。
  • 在 SunOS 系统上(包括 Solaris 和 SmartOS),这使用 event ports
  • 在 Windows 系统上,此功能依赖于 ReadDirectoryChangesW
  • 在 AIX 系统上,此功能依赖于 AHAFS,必须启用它。
  • 在 IBM i 系统上,不支持此功能。

如果由于某种原因底层功能不可用,则 fs.watch() 将无法运行并可能抛出异常。例如,在网络文件系统(NFS、SMB 等)或使用虚拟化软件(如 Vagrant 或 Docker)时的主机文件系统上,监视文件或目录可能不可靠,在某些情况下甚至不可能。

仍然可以使用 fs.watchFile(),它使用 stat 轮询,但这种方法较慢且可靠性较低。

在 Linux 和 macOS 系统上,fs.watch() 将路径解析为 inode 并监视该 inode。如果被监视的路径被删除并重新创建,它将被分配一个新的 inode。监视器将为删除发出事件,但将继续监视 原始 inode。新 inode 的事件将不会发出。这是预期行为。

AIX 文件在文件生命周期内保留相同的 inode。在 AIX 上保存并关闭被监视的文件将导致两个通知(一个用于添加新内容,一个用于截断)。

在回调中提供 filename 参数仅在 Linux、macOS、Windows 和 AIX 上受支持。即使在受支持的平台上,filename 也不总是保证提供。因此,不要假设回调中总是提供 filename 参数,如果它为 null,请准备一些回退逻辑。

import { watch } from 'node:fs';
watch('somedir', (eventType, filename) => {
  console.log(`event type is: ${eventType}`);
  if (filename) {
    console.log(`filename provided: ${filename}`);
  } else {
    console.log('filename not provided');
  }
});
Attributes
filename:string | Buffer | URL
options:Object
bigint:boolean
默认值: false
persistent:boolean
默认值: true
interval:integer
默认值: 5007
listener:Function
current:fs.Stats
previous:fs.Stats

监视 filename 的变化。每次访问文件时都会调用回调 listener

options 参数可以省略。如果提供,它应该是一个对象。该 options 对象可能包含一个名为 persistent 的布尔值,指示只要文件被监视,进程是否应继续运行。options 对象可以指定一个 interval 属性,指示目标应该被轮询的频率(以毫秒为单位)。

listener 接收两个参数:当前 stat 对象和上一个 stat 对象:

import { watchFile } from 'node:fs';

watchFile('message.text', (curr, prev) => {
  console.log(`the current mtime is: ${curr.mtime}`);
  console.log(`the previous mtime was: ${prev.mtime}`);
});

这些 stat 对象是 fs.Stat 的实例。如果 bigint 选项为 true,则这些对象中的数值指定为 BigInt

要在文件被修改而不仅仅是被访问时收到通知,需要比较 curr.mtimeMsprev.mtimeMs

fs.watchFile 操作导致 ENOENT 错误时,它将调用监听器一次,所有字段为零(对于日期,则为 Unix 纪元)。如果文件稍后创建,监听器将再次被调用,并传入最新的 stat 对象。这是自 v0.10 以来的功能变化。

使用 fs.watch()fs.watchFilefs.unwatchFile 更高效。当可能时,应使用 fs.watch 代替 fs.watchFilefs.unwatchFile

当被 fs.watchFile() 监视的文件消失并重新出现时,第二个回调事件(文件重新出现)中 previous 的内容将与第一个回调事件(其消失)中 previous 的内容相同。

这种情况发生在:

  • 文件被删除,随后恢复
  • 文件被重命名,然后再次重命名回其原始名称。
fs.write(fd, buffer, offset, length?, position?, callback): void
Attributes
buffer:Buffer | TypedArray | DataView
offset:integer
默认值: 0
length:integer
默认值: buffer.byteLength - offset
position:integer | null
默认值: null
callback:Function
err:Error
bytesWritten:integer
buffer:Buffer | TypedArray | DataView

buffer 写入由 fd 指定的文件。

offset 确定要写入的缓冲区部分,length 是一个整数,指定要写入的字节数。

position 指的是数据应写入的文件开头的偏移量。如果 typeof position !== 'number',数据将写入当前位置。参见 pwrite(2)

回调将获得三个参数 (err, bytesWritten, buffer),其中 bytesWritten 指定从 buffer 写入了多少 字节

如果此方法作为其 util.promisify() 版本被调用,它返回一个包含 bytesWrittenbuffer 属性的 Object 的 promise。

在不等待回调的情况下多次在同一文件上使用 fs.write() 是不安全的。对于此场景,推荐使用 fs.createWriteStream()

在 Linux 上,当文件以追加模式打开时,位置写入不起作用。内核忽略位置参数,并始终将数据追加到文件末尾。

M

fs.write

History
fs.write(fd, buffer, options?, callback): void
Attributes
buffer:Buffer | TypedArray | DataView
options:Object
offset:integer
默认值: 0
length:integer
默认值: buffer.byteLength - offset
position:integer | null
默认值: null
callback:Function
err:Error
bytesWritten:integer
buffer:Buffer | TypedArray | DataView

buffer 写入由 fd 指定的文件。

与上面的 fs.write 函数类似,此版本接受一个可选的 options 对象。如果未指定 options 对象,它将默认使用上述值。

fs.write(fd, string, position?, encoding?, callback): void
Attributes
string:string
position:integer | null
默认值: null
encoding:string
默认值: 'utf8'
callback:Function
err:Error
written:integer
string:string

string 写入由 fd 指定的文件。如果 string 不是字符串,将抛出异常。

position 指的是数据应写入的文件开头的偏移量。如果 typeof position !== 'number',数据将写入当前位置。参见 pwrite(2)

encoding 是预期的字符串编码。

回调将接收参数 (err, written, string),其中 written 指定传入的字符串需要写入多少 字节。写入的字节数不一定与写入的字符串字符数相同。参见 Buffer.byteLength

在不等待回调的情况下多次在同一文件上使用 fs.write() 是不安全的。对于此场景,推荐使用 fs.createWriteStream()

在 Linux 上,当文件以追加模式打开时,位置写入不起作用。内核忽略位置参数,并始终将数据追加到文件末尾。

在 Windows 上,如果文件描述符连接到控制台(例如 fd == 1stdout),默认情况下包含非 ASCII 字符的字符串将无法正确渲染,无论使用何种编码。可以通过使用 chcp 65001 命令更改活动代码页来配置控制台以正确渲染 UTF-8。有关更多详细信息,请参阅 chcp 文档。

M

fs.writeFile

fs.writeFile(file, data, options?, callback): void
Attributes
file:string | Buffer | URL | integer
文件名或文件描述符
data:string | Buffer | TypedArray | DataView
options:Object | string
encoding:string | null
默认值: 'utf8'
mode:integer
默认值: 0o666
flag:string
参见 [文件系统 flags 的支持][]。 默认值: 'w'
flush:boolean
如果所有数据都成功写入文件,并且 flushtrue ,则使用 fs.fsync() 刷新数据。 默认值: false
允许中止正在进行的 writeFile
callback:Function
err:Error | AggregateError

file 是文件名时,异步将数据写入文件,如果文件已存在则替换该文件。data 可以是字符串或缓冲区。

file 是文件描述符时,行为类似于直接调用 fs.write()(推荐使用)。参见下面关于使用文件描述符的说明。

如果 data 是缓冲区,则忽略 encoding 选项。

mode 选项仅影响新创建的文件。有关更多详细信息,请参阅 fs.open().

import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';

const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, (err) => {
  if (err) throw err;
  console.log('文件已保存!');
});

如果 options 是字符串,则它指定编码:

import { writeFile } from 'node:fs';

writeFile('message.txt', 'Hello Node.js', 'utf8', callback);

在不等待回调的情况下,多次在同一文件上使用 fs.writeFile() 是不安全的。对于这种场景,推荐使用 fs.createWriteStream()

fs.readFile 类似,fs.writeFile 是一个便利方法,它会在内部执行多次 write 调用,以写入传递给它的缓冲区。对于性能敏感的代码,建议考虑使用 fs.createWriteStream()

可以使用 AbortSignal 来取消 fs.writeFile()。取消是“尽最大努力”的,仍可能会有少量数据被写入。

import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';

const controller = new AbortController();
const { signal } = controller;
const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, { signal }, (err) => {
  // 当请求被中止时 - 回调会被调用并传入一个 AbortError
});
// 当请求应该被中止时
controller.abort();

中止正在进行的请求不会中止单个操作系统请求,而是中止 fs.writeFile 执行的内部缓冲。

file 是文件描述符时,行为几乎与直接调用 fs.write() 相同,例如:

import { write } from 'node:fs';
import { Buffer } from 'node:buffer';

write(fd, Buffer.from(data, options.encoding), callback);

与直接调用 fs.write() 的区别在于,在某些不寻常的情况下,fs.write() 可能只写入缓冲区的一部分,需要重试以写入剩余数据,而 fs.writeFile() 会重试直到数据完全写入(或发生错误)。

这一点的影响是一个常见的混淆来源。在文件描述符的情况下,文件不会被替换!数据不一定写入文件的开头,文件的原始数据可能保留在新写入数据之前和/或之后。

例如,如果连续调用两次 fs.writeFile(),第一次写入字符串 'Hello',然后写入字符串 ', World',文件将包含 'Hello, World',并且可能包含文件的一些原始数据(取决于原始文件的大小和文件描述符的位置)。如果使用的是文件名而不是描述符,文件将保证只包含 ', World'

fs.writev(fd, buffers, position?, callback): void
Attributes
buffers:ArrayBufferView[]
position:integer | null
默认值: null
callback:Function
err:Error
bytesWritten:integer
buffers:ArrayBufferView[]

使用 writev()ArrayBufferView 数组写入由 fd 指定的文件。

position 是数据应写入的文件开头的偏移量。如果 typeof position !== 'number',数据将写入当前位置。

回调将获得三个参数:errbytesWrittenbuffersbytesWritten 是从 buffers 写入的字节数。

如果此方法被 util.promisify(),它返回一个包含 bytesWrittenbuffers 属性的 Object 的 promise。

在不等待回调的情况下多次在同一文件上使用 fs.writev() 是不安全的。对于此场景,使用 fs.createWriteStream()

在 Linux 上,当文件以追加模式打开时,位置写入不起作用。内核忽略位置参数,并始终将数据追加到文件末尾。

同步 API 同步执行所有操作,阻塞事件循环直到操作完成或失败。

fs.accessSync(path, mode?): void
Attributes
path:string | Buffer | URL
mode:integer
默认: fs.constants.F_OK

同步测试由 path 指定的文件或目录的权限。mode 参数是一个可选整数,指定要执行的访问检查。mode 应该是值 fs.constants.F_OK 或由 fs.constants.R_OKfs.constants.W_OKfs.constants.X_OK 的按位 OR 组成的掩码(例如 fs.constants.W_OK | fs.constants.R_OK)。查看 文件访问常量 以获取 mode 的可能值。

如果任何访问检查失败,将抛出 Error。否则,该方法将返回 undefined

import { accessSync, constants } from 'node:fs';

try {
  accessSync('etc/passwd', constants.R_OK | constants.W_OK);
  console.log('可以读/写');
} catch (err) {
  console.error('没有访问权限!');
}
fs.appendFileSync(path, data, options?): void
Attributes
path:string | Buffer | URL | number
文件名或文件描述符
data:string | Buffer
options:Object | string
encoding:string | null
默认: 'utf8'
mode:integer
默认: 0o666
flag:string
查看 [文件系统 flags 的支持][]。 默认: 'a'
flush:boolean
如果为 true ,底层文件描述符在关闭之前会被刷新。 默认: false

同步地将数据追加到文件,如果文件不存在则创建它。data 可以是字符串或 Buffer

mode 选项仅影响新创建的文件。查看更多详情 fs.open()

import { appendFileSync } from 'node:fs';

try {
  appendFileSync('message.txt', '要追加的数据');
  console.log('“要追加的数据”已追加到文件!');
} catch (err) {
  /* 处理错误 */
}

如果 options 是字符串,则它指定编码:

import { appendFileSync } from 'node:fs';

appendFileSync('message.txt', '要追加的数据', 'utf8');

path 可以指定为已打开用于追加的数字文件描述符(使用 fs.open()fs.openSync())。文件描述符不会自动关闭。

import { openSync, closeSync, appendFileSync } from 'node:fs';

let fd;

try {
  fd = openSync('message.txt', 'a');
  appendFileSync(fd, '要追加的数据', 'utf8');
} catch (err) {
  /* 处理错误 */
} finally {
  if (fd !== undefined)
    closeSync(fd);
}
Attributes
path:string | Buffer | URL
mode:string | integer

详细信息,请参阅此 API 异步版本的文档:fs.chmod()

查看更多详情 POSIX chmod(2) 文档。

Attributes
path:string | Buffer | URL

同步更改文件的所有者和组。返回 undefined。 这是 fs.chown() 的同步版本。

有关更多详细信息,请参阅 POSIX chown(2) 文档。

关闭文件描述符

History
Attributes

关闭文件描述符。返回 undefined

在任何当前通过任何其他 fs 操作使用的文件描述符 (fd) 上调用 fs.closeSync() 可能导致未定义的行为。

查看更多详情 POSIX close(2) 文档。

Attributes
src:string | Buffer | URL
要复制的源文件名
dest:string | Buffer | URL
复制操作的目标文件名
mode:integer
复制操作的修饰符。 默认: 0

同步地将 src 复制到 dest。默认情况下,如果 dest 已存在,则会被覆盖。返回 undefined。Node.js 不保证复制操作的原子性。如果在打开目标文件进行写入后发生错误,Node.js 将尝试移除目标。

mode 是一个可选整数,指定复制操作的行为。可以创建一个由两个或更多值的按位 OR 组成的掩码(例如 fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE)。

  • fs.constants.COPYFILE_EXCL:如果 dest 已存在,复制操作将失败。
  • fs.constants.COPYFILE_FICLONE:复制操作将尝试创建写时复制 reflink。如果平台不支持写时复制,则使用回退复制机制。
  • fs.constants.COPYFILE_FICLONE_FORCE:复制操作将尝试创建写时复制 reflink。如果平台不支持写时复制,则操作将失败。
import { copyFileSync, constants } from 'node:fs';

// 默认情况下,destination.txt 将被创建或覆盖。
copyFileSync('source.txt', 'destination.txt');
console.log('source.txt 已复制到 destination.txt');

// 通过使用 COPYFILE_EXCL,如果 destination.txt 存在,操作将失败。
copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
fs.cpSync(src, dest, options?): void
Attributes
src:string | URL
要复制的源路径。
dest:string | URL
要复制到的目标路径。
options:Object
dereference:boolean
解引用符号链接。 默认: false
errorOnExist:boolean
forcefalse 且目标存在时,抛出错误。 默认: false
filter:Function
用于过滤复制的文件/目录的函数。返回 true 以复制该项目, false 以忽略它。忽略目录时,其所有内容也将被跳过。 默认: undefined
src:string
要复制的源路径。
dest:string
要复制到的目标路径。
force:boolean
覆盖现有文件或目录。如果将此设置为 false 且目标存在,复制操作将忽略错误。使用 errorOnExist 选项更改此行为。 默认: true
mode:integer
复制操作的修饰符。 默认: 0 。 参见 fs.copyFileSync()mode 标志。
preserveTimestamps:boolean
当为 true 时,将保留来自 src 的时间戳。 默认: false
recursive:boolean
递归复制目录 默认: false
verbatimSymlinks:boolean
当为 true 时,将跳过符号链接的路径解析。 默认: false

同步地将整个目录结构从 src 复制到 dest,包括子目录和文件。

将目录复制到另一个目录时,不支持通配符,行为类似于 cp dir1/ dir2/

fs.existsSync(path): void
Attributes
path:string | Buffer | URL

如果路径存在则返回 true,否则返回 false

详细信息,请参阅此 API 异步版本的文档:fs.exists()

fs.exists() 已弃用,但 fs.existsSync() 没有。fs.exists()callback 参数接受的参数与其他 Node.js 回调不一致。fs.existsSync() 不使用回调。

import { existsSync } from 'node:fs';

if (existsSync('/etc/passwd'))
  console.log('该路径存在。');
M

fs.fchmodSync

History
fs.fchmodSync(fd, mode): void
Attributes
mode:string | integer

设置文件的权限。返回 undefined

有关更多详情,请参阅 POSIX fchmod(2) 文档。

M

fs.fchownSync

History
fs.fchownSync(fd, uid, gid): void
Attributes
文件新所有者的用户 ID。
文件新组的组 ID。

设置文件的所有者。返回 undefined

有关详细信息,请参阅 POSIX fchown(2) 文档。

M

fs.fdatasyncSync

History
fs.fdatasyncSync(fd): void
Attributes

强制所有当前与该文件关联的排队 I/O 操作进入操作系统的同步 I/O 完成状态。参考 POSIX fdatasync(2) 文档获取详情。返回 undefined

fs.fstatSync(fd, options?): void
Attributes
options:Object
bigint:boolean
返回的 fs.Stats 对象中的数值是否应为 bigint默认: false

检索文件描述符的 fs.Stats

有关更多详细信息,请参阅 POSIX fstat(2) 文档。

M

fs.fsyncSync

History
fs.fsyncSync(fd): void
Attributes

请求将打开文件描述符的所有数据刷新到存储设备。具体实现取决于操作系统和设备。参考 POSIX fsync(2) 文档获取更多详情。返回 undefined

M

fs.ftruncateSync

History
fs.ftruncateSync(fd, len?): void
Attributes
默认: 0

截断文件描述符。返回 undefined

详细信息,请参阅此 API 异步版本的文档:fs.ftruncate()

fs.futimesSync(fd, atime, mtime): void
Attributes
atime:number | string | Date
mtime:number | string | Date

fs.futimes() 的同步版本。返回 undefined

fs.globSync(pattern, options?): void
Attributes
pattern:string | string[]
options:Object
cwd:string | URL
当前工作目录。 默认: process.cwd()
exclude:Function | string[]
用于过滤文件/目录的函数,或要排除的 glob 模式列表。如果提供函数,返回 true 表示排除该项,返回 false 表示包含它。 默认: undefined
followSymlinks:boolean
当为 true 时,在展开 ** 模式时会跟随指向目录的符号链接。 默认: false
withFileTypes:boolean
如果 glob 应返回 Dirent 形式的路径则为 true ,否则为 false默认: false

启用 followSymlinks 后,检测到的符号链接循环不会递归遍历。

import { globSync } from 'node:fs';

console.log(globSync('**/*.js'));
const { globSync } = require('node:fs');

console.log(globSync('**/*.js'));
M

fs.lchmodSync

History
fs.lchmodSync(path, mode): void

稳定性:0 - 已弃用

Attributes
path:string | Buffer | URL
mode:integer

更改符号链接上的权限。返回 undefined

此方法仅在 macOS 上实现。

查看更多详情 POSIX lchmod(2) 文档。

M

fs.lchownSync

History
fs.lchownSync(path, uid, gid): void
Attributes
path:string | Buffer | URL
文件新所有者的用户 id。
文件新组的组 id。

设置路径的所有者。返回 undefined

查看更多详情 POSIX lchown(2) 文档。

M

fs.lutimesSync

History
fs.lutimesSync(path, atime, mtime): void
Attributes
path:string | Buffer | URL
atime:number | string | Date
mtime:number | string | Date

更改由 path 引用的符号链接的文件系统时间戳。返回 undefined,或者当参数不正确或操作失败时抛出异常。这是 fs.lutimes() 的同步版本。

fs.linkSync(existingPath, newPath): void
Attributes
existingPath:string | Buffer | URL
newPath:string | Buffer | URL

创建从 existingPathnewPath 的新链接。查看更多详情 POSIX link(2) 文档。返回 undefined

fs.lstatSync(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.Stats 对象中的数值是否应为 bigint默认: false
throwIfNoEntry:boolean
如果没有文件系统条目存在,是否抛出异常,而不是返回 undefined默认: true

检索由 path 引用的符号链接的 fs.Stats

有关更多详细信息,请参阅 POSIX lstat(2) 文档。

fs.mkdirSync(path, options?): void
Attributes
path:string | Buffer | URL
options:Object | integer
recursive:boolean
默认: false
mode:string | integer
Windows 上不支持。 默认: 0o777

同步创建目录。返回 undefined,或者如果 recursivetrue,则返回第一个创建的目录路径。 这是 fs.mkdir() 的同步版本。

查看更多详情 POSIX mkdir(2) 文档。

fs.mkdtempSync(prefix, options?): void
Attributes
prefix:string | Buffer | URL
options:string | Object
encoding:string
默认: 'utf8'

返回创建的目录路径。

详细信息,请参阅此 API 异步版本的文档:fs.mkdtemp()

可选的 options 参数可以是指定编码的字符串,或者是具有 encoding 属性以指定要使用的字符编码的对象。

M

fs.mkdtempDisposableSync

History
fs.mkdtempDisposableSync(prefix, options?): void
Attributes
prefix:string | Buffer | URL
options:string | Object
encoding:string
默认: 'utf8'
path:string
已创建目录的路径。
remove:Function
一个移除已创建目录的函数。
[Symbol.dispose]:Function
remove 相同。

返回一个可处置对象,其 path 属性持有已创建的目录路径。当对象被处置时,如果目录仍然存在,目录及其内容将被移除。如果目录无法删除,处置将抛出错误。该对象有一个 remove() 方法将执行相同的任务。

有关显式资源管理的更多信息,请参阅 MDN 关于 using 语句的文档

详细信息,请参阅 fs.mkdtemp() 的文档。

此 API 没有基于回调的版本,因为它设计用于 using 语法。

可选的 options 参数可以是指定编码的字符串,或者是具有 encoding 属性以指定要使用的字符编码的对象。

fs.opendirSync(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
encoding:string | null
默认: 'utf8'
bufferSize:number
从目录读取时内部缓冲的目录条目数。较高的值可带来更好的性能,但会占用更多内存。 默认: 32
recursive:boolean
默认: false

同步打开目录。参见 opendir(3)

创建一个 fs.Dir,其中包含用于从目录读取内容以及清理目录的所有后续函数。

encoding 选项设置打开目录和后续读取操作时 path 的编码。

fs.openSync(path, flags?, mode?): void
Attributes
path:string | Buffer | URL
flags:string | number
默认: 'r' 。参见 [文件系统 flags 的支持][]。
mode:string | integer
默认: 0o666

返回一个代表文件描述符的整数。

详细信息,请参阅此 API 异步版本的文档:fs.open()

fs.readdirSync(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认: 'utf8'
withFileTypes:boolean
默认: false
recursive:boolean
如果为 true ,递归读取目录的内容。在递归模式下,它将列出所有文件、子文件和目录。 默认: false

读取目录的内容。

查看更多详情,请参阅 POSIX readdir(3) 文档。

可选的 options 参数可以是指定编码的字符串,或者是具有 encoding 属性以指定用于返回文件名的字符编码的对象。如果 encoding 设置为 'buffer',返回的文件名将作为 Buffer 对象传递。

如果 options.withFileTypes 设置为 true,结果将包含 fs.Dirent 对象。

fs.readFileSync(path, options?): void
Attributes
path:string | Buffer | URL | integer
文件名或文件描述符
options:Object | string
encoding:string | null
默认: null
flag:string
参见 [文件系统 flags 的支持][]。 默认: 'r'
buffer:Buffer | TypedArray | DataView | Function
用于读取的缓冲区,或者一个以文件大小为参数并返回缓冲区的函数。

返回 path 的内容。

详细信息,请参阅此 API 异步版本的文档:fs.readFile()

如果指定了 encoding 选项,则此函数返回字符串。否则它返回缓冲区。

如果提供了 buffer,且未指定编码,则返回的 Buffer 是所提供缓冲区的一个视图,其中只包含已读取的字节。如果所提供的缓冲区太小,无法容纳整个文件,则会抛出错误。

fs.readFile() 类似,当路径是目录时,fs.readFileSync() 的行为取决于平台。

import { readFileSync } from 'node:fs';

// macOS、Linux 和 Windows
readFileSync('<directory>');
// => [错误:EISDIR:目录上的非法操作,读取 <directory>]

// FreeBSD
readFileSync('<directory>'); // => <数据>
fs.readlinkSync(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认: 'utf8'

返回符号链接的字符串值。

查看更多 POSIX readlink(2) 文档。

可选的 options 参数可以是指定编码的字符串,或者是具有 encoding 属性以指定用于返回的链接路径的字符编码的对象。如果 encoding 设置为 'buffer',返回的链接路径将作为 Buffer 对象传递。

fs.readSync(fd, buffer, offset, length, position?): void
Attributes
buffer:Buffer | TypedArray | DataView
offset:integer
length:integer
position:integer | bigint | null
默认: null

详细信息,请参阅此 API 异步版本的文档:fs.read()

fs.readSync(fd, buffer, options?): void
Attributes
buffer:Buffer | TypedArray | DataView
options:Object
offset:integer
默认: 0
length:integer
默认: buffer.byteLength - offset
position:integer | bigint | null
默认: null

类似于上面的 fs.readSync 函数,此版本接受可选的 options 对象。 如果未指定 options 对象,它将默认使用上述值。

详细信息,请参阅此 API 异步版本的文档:fs.read()

M

fs.readvSync

History
fs.readvSync(fd, buffers, position?): void
Attributes
buffers:ArrayBufferView[]
position:integer | null
默认: null

详细信息,请参阅此 API 异步版本的文档:fs.readv()

fs.realpathSync(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认: 'utf8'

返回解析后的路径名。

详细信息,请参阅此 API 异步版本的文档:fs.realpath()

M

fs.realpathSync.native

History
fs.realpathSync.native(path, options?): void
Attributes
path:string | Buffer | URL
options:string | Object
encoding:string
默认: 'utf8'

同步 realpath(3)

仅支持可以转换为 UTF8 字符串的路径。

可选的 options 参数可以是指定编码的字符串,或者是具有 encoding 属性以指定用于返回路径的字符编码的对象。如果 encoding 设置为 'buffer',返回的路径将作为 Buffer 对象传递。

在 Linux 上,当 Node.js 链接到 musl libc 时,必须将 procfs 文件系统挂载在 /proc 上以便此函数工作。Glibc 没有此限制。

fs.renameSync(oldPath, newPath): void
Attributes
oldPath:string | Buffer | URL
newPath:string | Buffer | URL

将文件从 oldPath 重命名为 newPath。返回 undefined

更多详情请参阅 POSIX rename(2) 文档。

M

fs.rmdirSync

fs.rmdirSync(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
目前未公开任何选项。过去有 recursivemaxBusyTriesemfileWait 的选项,但它们已弃用并移除。 options 参数仍被接受以保持向后兼容,但不使用。

同步 rmdir(2)。返回 undefined

在文件(非目录)上使用 fs.rmdirSync() 在 Windows 上会导致 ENOENT 错误,在 POSIX 上会导致 ENOTDIR 错误。

要获得类似于 rm -rf Unix 命令的行为,请使用 fs.rmSync() 并带有选项 { recursive: true, force: true }

fs.rmSync(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
force:boolean
当为 true 时,如果 path 不存在,异常将被忽略。 默认: false
maxRetries:integer
如果遇到 EBUSYEMFILEENFILEENOTEMPTYEPERM 错误,Node.js 将重试操作,每次尝试线性退后等待 retryDelay 毫秒。此选项代表重试次数。如果 recursive 选项不为 true ,则忽略此选项。 默认: 0
recursive:boolean
如果为 true ,执行递归目录移除。在递归模式下,失败时会重试操作。 默认: false
retryDelay:integer
重试之间等待的毫秒数。如果 recursive 选项不为 true ,则忽略此选项。 默认: 100

同步移除文件和目录(基于标准 POSIX rm 实用程序建模)。返回 undefined

fs.statSync(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.Stats 对象中的数值是否应为 bigint默认: false
throwIfNoEntry:boolean
如果没有文件系统条目存在,是否抛出异常,而不是返回 undefined默认: true

检索路径的 fs.Stats

M

fs.statfsSync

History
fs.statfsSync(path, options?): void
Attributes
path:string | Buffer | URL
options:Object
bigint:boolean
返回的 fs.StatFs 对象中的数值是否应为 bigint默认: false

同步 statfs(2)。返回包含 path 的挂载文件系统的信息。

如果发生错误,err.code 将是 常见系统错误 之一。

fs.symlinkSync(target, path, type?): void
Attributes
target:string | Buffer | URL
path:string | Buffer | URL
type:string | null
默认: null

详细信息,请参阅此 API 异步版本的文档:fs.symlink()

M

fs.truncateSync

History
fs.truncateSync(path, len?): void
Attributes
path:string | Buffer | URL
默认: 0

截断文件。返回 undefined。文件描述符也可以作为第一个参数传递。在这种情况下,调用 fs.ftruncateSync()

传递文件描述符已弃用,并可能导致将来抛出错误。

fs.unlinkSync(path): void
Attributes
path:string | Buffer | URL

同步 unlink(2)。返回 undefined

fs.utimesSync(path, atime, mtime): void
Attributes
path:string | Buffer | URL
atime:number | string | Date
mtime:number | string | Date

详细信息,请参阅此 API 异步版本的文档:fs.utimes()

fs.writeFileSync(file, data, options?): void
Attributes
file:string | Buffer | URL | integer
文件名或文件描述符
data:string | Buffer | TypedArray | DataView
options:Object | string
encoding:string | null
默认: 'utf8'
mode:integer
默认: 0o666
flag:string
参见 [文件系统 flags 的支持][]。 默认: 'w'
flush:boolean
如果所有数据成功写入文件,且 flushtrue ,则使用 fs.fsyncSync() 刷新数据。

mode 选项仅影响新创建的文件。查看更多详情 fs.open()

详细信息,请参阅此 API 异步版本的文档:fs.writeFile()

fs.writeSync(fd, buffer, offset, length?, position?): void
Attributes
buffer:Buffer | TypedArray | DataView
offset:integer
默认: 0
length:integer
默认: buffer.byteLength - offset
position:integer | null
默认: null

详细信息,请参阅此 API 异步版本的文档:fs.write(fd, buffer...)

M

fs.writeSync

History
fs.writeSync(fd, buffer, options?): number
Attributes
buffer:Buffer | TypedArray | DataView
options:Object
offset?:integer
Default: 0
length?:integer
Default: buffer.byteLength - offset
position?:integer | null
Default: null
Returns:number
The number of bytes written.

For more information, see the documentation for the asynchronous version of this API: fs.write(fd, buffer...).

fs.writeSync(fd, string, position?, encoding?): void
Attributes
string:string
position:integer | null
默认: null
encoding:string
默认: 'utf8'

详细信息,请参阅此 API 异步版本的文档:fs.write(fd, string...)

M

fs.writevSync

History
fs.writevSync(fd, buffers, position?): void
Attributes
buffers:ArrayBufferView[]
position:integer | null
默认: null

详细信息,请参阅此 API 异步版本的文档:fs.writev()

常用对象由所有文件系统 API 变体(promise、回调和同步)共享。

类:fs.Dir

History

表示目录流的类。

fs.opendir()fs.opendirSync()fsPromises.opendir() 创建。

import { opendir } from 'node:fs/promises';

try {
  const dir = await opendir('./');
  for await (const dirent of dir)
    console.log(dirent.name);
} catch (err) {
  console.error(err);
}

使用异步迭代器时,fs.Dir 对象将在迭代器退出后自动关闭。

M

dir.close

History
dir.close(): void

异步关闭目录的底层资源句柄。 后续读取将导致错误。

返回一个 Promise,在资源关闭后变为已完成。

dir.close(callback): void
Attributes
callback:Function
err:Error

异步关闭目录的底层资源句柄。 后续读取将导致错误。

资源句柄关闭后将调用 callback

M

dir.closeSync

History
dir.closeSync(): void

同步关闭目录的底层资源句柄。 后续读取将导致错误。

P

dir.path

History

此目录的只读路径,如同提供给 fs.opendir()fs.opendirSync()fsPromises.opendir() 的那样。

M

dir.read

History
dir.read(): void
  • 返回:Promise 完成值为 fs.Dirent | null

通过 readdir(3) 异步读取下一个目录条目作为 fs.Dirent

返回一个 Promise,它将在返回 fs.Dirent 时完成;如果没有更多目录条目可读,则为 null

此函数返回的目录条目没有特定顺序,由操作系统底层目录机制提供。 迭代目录时添加或删除的条目可能不包含在迭代结果中。

M

dir.read

History
dir.read(callback): void
Attributes
callback:Function
err:Error
dirent:fs.Dirent | null

通过 readdir(3) 异步读取下一个目录条目作为 fs.Dirent

读取完成后,将使用 fs.Dirent 调用 callback,如果没有更多目录条目可读,则为 null

此函数返回的目录条目没有特定顺序,由操作系统底层目录机制提供。 迭代目录时添加或删除的条目可能不包含在迭代结果中。

M

dir.readSync

History
dir.readSync(): void
  • 返回:fs.Dirent | null

同步读取下一个目录条目作为 fs.Dirent。有关更多详细信息,请参阅 POSIX readdir(3) 文档。

如果没有更多目录条目可读,将返回 null

此函数返回的目录条目没有特定顺序,由操作系统底层目录机制提供。 迭代目录时添加或删除的条目可能不包含在迭代结果中。

M

dir[Symbol.asyncIterator]

History
dir[Symbol.asyncIterator](): void

异步迭代目录直到所有条目都被读取。有关更多详细信息,请参阅 POSIX readdir(3) 文档。

异步迭代器返回的条目始终是 fs.Dirent。 来自 dir.read()null 情况在内部处理。

参见 fs.Dir 获取示例。

此迭代器返回的目录条目没有特定顺序,由操作系统底层目录机制提供。 迭代目录时添加或删除的条目可能不包含在迭代结果中。

M

dir[Symbol.asyncDispose]

History
dir[Symbol.asyncDispose](): void

如果目录句柄是打开的,则调用 dir.close(),并返回一个在处置完成时变为已完成的 Promise。

此方法支持将目录与 await using 一起使用;当作用域退出时,目录将自动关闭。有关更多信息,请参阅 MDN 的 using 语句文档。

M

dir[Symbol.dispose]

History
dir[Symbol.dispose](): void

如果目录句柄是打开的,则调用 dir.closeSync(),并返回 undefined

此方法支持将目录与 using 一起使用;当作用域退出时,目录将自动关闭。有关更多信息,请参阅 MDN 的 using 语句文档。

类:fs.Dirent

History

目录条目的表示,可以是目录内的文件或子目录,由从 fs.Dir 读取返回。目录条目是文件名和文件类型对的组合。

此外,当调用 fs.readdir()fs.readdirSync() 并将 withFileTypes 选项设置为 true 时,结果数组将填充 fs.Dirent 对象,而不是字符串或 Buffer

M

dirent.isBlockDevice

History
dirent.isBlockDevice(): void

如果 fs.Dirent 对象描述块设备,则返回 true

M

dirent.isCharacterDevice

History
dirent.isCharacterDevice(): void

如果 fs.Dirent 对象描述字符设备,则返回 true

M

dirent.isDirectory

History
dirent.isDirectory(): void

如果 fs.Dirent 对象描述文件系统 目录,则返回 true

M

dirent.isFIFO

History
dirent.isFIFO(): void

如果 fs.Dirent 对象描述先进先出 (FIFO) 管道,则返回 true

M

dirent.isFile

History
dirent.isFile(): void

如果 fs.Dirent 对象描述常规文件,则返回 true

M

dirent.isSocket

History
dirent.isSocket(): void

如果 fs.Dirent 对象描述套接字,则返回 true

M
History
dirent.isSymbolicLink(): void

如果 fs.Dirent 对象描述符号链接,则返回 true

P

dirent.name

History
  • 类型:string | Buffer

fs.Dirent 对象引用的文件名。此 值的类型由传递给 fs.readdir()fs.readdirSync()options.encoding 决定。

P

dirent.parentPath

History

fs.Dirent 对象引用的文件的父目录路径。

类:fs.FSWatcher

History

成功调用 fs.watch() 方法将返回一个新的 fs.FSWatcher 对象。

每当特定的被监视文件被修改时,所有 fs.FSWatcher 对象都会发出 'change' 事件。

事件:'change'

History
Attributes
eventType:string
发生的变更事件类型
filename:string | Buffer
更改的文件名(如果相关/可用)

当被监视的目录或文件中的某些内容发生变化时发出。 参见 fs.watch() 获取更多详细信息。

根据操作系统支持情况,可能不提供 filename 参数。如果提供了 filename,如果 调用 fs.watch() 时其 encoding 选项设置为 'buffer',它将作为 Buffer 提供,否则 filename 将是 UTF-8 字符串。

import { watch } from 'node:fs';
// 当通过 fs.watch() 监听器处理时的示例
watch('./tmp', { encoding: 'buffer' }, (eventType, filename) => {
  if (filename) {
    console.log(filename);
    // 输出:<Buffer ...>
  }
});

事件:'close'

History

当监视器停止监视更改时发出。已关闭的 fs.FSWatcher 对象在事件处理程序中不再可用。

事件:'error'

History
Attributes
error:Error

当监视文件时发生错误时发出。出错的 fs.FSWatcher 对象在事件处理程序中不再可用。

M

watcher.close

History
watcher.close(): void

停止监视给定 fs.FSWatcher 上的更改。一旦停止, fs.FSWatcher 对象不再可用。

M

watcher.ref

History
watcher.ref(): void
  • 返回:fs.FSWatcher

调用时,请求 Node.js 事件循环只要 fs.FSWatcher 处于活动状态就不要退出。多次调用 watcher.ref() 将无效。

默认情况下,所有 fs.FSWatcher 对象都是“已引用”的,因此通常不需要调用 watcher.ref(),除非之前调用过 watcher.unref()

M

watcher.unref

History
watcher.unref(): void
  • 返回:fs.FSWatcher

调用时,活动的 fs.FSWatcher 对象将不需要 Node.js 事件循环保持活动。如果没有其他活动保持 事件循环运行,进程可能在 fs.FSWatcher 对象的 回调被调用之前退出。多次调用 watcher.unref() 将无效。

类:fs.StatWatcher

History

成功调用 fs.watchFile() 方法将返回一个新的 fs.StatWatcher 对象。

M

watcher.ref

History
watcher.ref(): void
  • 返回:fs.StatWatcher

调用时,请求 Node.js 事件循环只要 fs.StatWatcher 处于活动状态就不要退出。多次调用 watcher.ref() 将无效。

默认情况下,所有 fs.StatWatcher 对象都是"ref'ed",因此通常不需要调用 watcher.ref(),除非之前调用过 watcher.unref()

M

watcher.unref

History
watcher.unref(): void
  • 返回:fs.StatWatcher

调用时,活动的 fs.StatWatcher 对象将不需要 Node.js 事件循环保持活动。如果没有其他活动保持 事件循环运行,进程可能在 fs.StatWatcher 对象的 回调被调用之前退出。多次调用 watcher.unref() 将无效。

类:fs.ReadStream

History
  • 继承:stream.Readable

fs.ReadStream 的实例不能直接构造。它们是使用 fs.createReadStream() 函数创建并返回的。

事件:'close'

History

fs.ReadStream 的底层文件描述符已关闭时发出。

事件:'open'

History
Attributes
fs.ReadStream 使用的整数文件描述符。

fs.ReadStream 的文件描述符已打开时发出。

事件:'ready'

History

fs.ReadStream 准备好使用时发出。

'open' 之后立即触发。

P

readStream.bytesRead

History

到目前为止已读取的字节数。

P

readStream.path

History
  • 类型:string | Buffer

流正在读取的文件的路径,如 fs.createReadStream() 的第一个 参数中指定。如果 path 作为字符串传递,则 readStream.path 将是字符串。如果 path 作为 Buffer 传递,则 readStream.path 将是 Buffer。如果指定了 fd,则 readStream.path 将是 undefined

P

readStream.pending

History

如果底层文件尚未打开,即在发出 'ready' 事件之前,此 属性为 true

fs.Stats 对象提供有关文件的信息。

fs.stat()fs.lstat()fs.fstat() 及其 同步对应物返回的对象属于此类型。 如果传递给这些方法的选项中的 bigint 为 true,则数值 将为 bigint 而不是 number,并且对象将包含额外的 纳秒精度属性,后缀为 Ns。 不应直接使用 new 关键字创建 Stat 对象。

Stats {
  dev: 2114,
  ino: 48064969,
  mode: 33188,
  nlink: 1,
  uid: 85,
  gid: 100,
  rdev: 0,
  size: 527,
  blksize: 4096,
  blocks: 8,
  atimeMs: 1318289051000.1,
  mtimeMs: 1318289051000.1,
  ctimeMs: 1318289051000.1,
  birthtimeMs: 1318289051000.1,

  // Date 的实例
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT,

  // Temporal.Instant 的实例
  atimeInstant: 2011-10-10T23:24:11.0001Z,
  mtimeInstant: 2011-10-10T23:24:11.0001Z,
  ctimeInstant: 2011-10-10T23:24:11.0001Z,
  birthtimeInstant: 2011-10-10T23:24:11.0001Z
}

bigint 版本:

BigIntStats {
  dev: 2114n,
  ino: 48064969n,
  mode: 33188n,
  nlink: 1n,
  uid: 85n,
  gid: 100n,
  rdev: 0n,
  size: 527n,
  blksize: 4096n,
  blocks: 8n,
  atimeMs: 1318289051000n,
  mtimeMs: 1318289051000n,
  ctimeMs: 1318289051000n,
  birthtimeMs: 1318289051000n,
  atimeNs: 1318289051000000000n,
  mtimeNs: 1318289051000000000n,
  ctimeNs: 1318289051000000000n,
  birthtimeNs: 1318289051000000000n,

  // Date 的实例
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT,

  // Temporal.Instant 的实例
  atimeInstant: 2011-10-10T23:24:11Z,
  mtimeInstant: 2011-10-10T23:24:11Z,
  ctimeInstant: 2011-10-10T23:24:11Z,
  birthtimeInstant: 2011-10-10T23:24:11Z
}
M

stats.isBlockDevice

History
stats.isBlockDevice(): void

如果 fs.Stats 对象描述块设备,则返回 true

M

stats.isCharacterDevice

History
stats.isCharacterDevice(): void

如果 fs.Stats 对象描述字符设备,则返回 true

M

stats.isDirectory

History
stats.isDirectory(): void

如果 fs.Stats 对象描述文件系统 目录,则返回 true

如果 fs.Stats 对象是通过在符号链接上调用 fs.lstat() 获得的, 该符号链接解析为目录,则此方法将返回 false。 这是因为 fs.lstat() 返回有关 符号链接本身的信息,而不是它解析到的路径。

M

stats.isFIFO

History
stats.isFIFO(): void

如果 fs.Stats 对象描述先进先出 (FIFO) 管道,则返回 true

M

stats.isFile

History
stats.isFile(): void

如果 fs.Stats 对象描述常规文件,则返回 true

M

stats.isSocket

History
stats.isSocket(): void

如果 fs.Stats 对象描述套接字,则返回 true

M
History
stats.isSymbolicLink(): void

如果 fs.Stats 对象描述符号链接,则返回 true

此方法仅在使用 fs.lstat() 时有效。

  • 类型:number | bigint

包含文件所在设备的数字标识符。

  • 类型:number | bigint

特定于文件的文件系统 inode 编号。

  • 类型:number | bigint

描述文件类型和模式的位字段。

  • 类型:number | bigint

文件存在的硬链接数。

  • 类型:number | bigint

拥有文件的用户的数字用户标识符 (POSIX)。

  • 类型:number | bigint

拥有文件的组的数字组标识符 (POSIX)。

  • 类型:number | bigint

如果文件代表设备,则为数字设备标识符。

  • 类型:number | bigint

文件的大小(字节)。

如果底层文件系统不支持获取文件大小, 则此值为 0

  • 类型:number | bigint

用于 I/O 操作的文件系统块大小。

  • 类型:number | bigint

为此文件分配的块数。

P

stats.atimeMs

History
  • 类型:number | bigint

表示上次访问此文件的时间戳,以自 POSIX 纪元以来的 毫秒数表示。

P

stats.mtimeMs

History
  • 类型:number | bigint

表示上次修改此文件的时间戳,以自 POSIX 纪元以来的 毫秒数表示。

P

stats.ctimeMs

History
  • 类型:number | bigint

表示上次更改文件状态的时间戳,以自 POSIX 纪元以来的 毫秒数表示。

P

stats.birthtimeMs

History
  • 类型:number | bigint

表示此文件创建时间的时间戳,以自 POSIX 纪元以来的 毫秒数表示。

P

stats.atimeNs

History

仅当将 bigint: true 传递给生成 对象的方法时才存在。 表示上次访问此文件的时间戳,以自 POSIX 纪元以来的 纳秒数表示。

P

stats.mtimeNs

History

仅当将 bigint: true 传递给生成 对象的方法时才存在。 表示上次修改此文件的时间戳,以自 POSIX 纪元以来的 纳秒数表示。

P

stats.ctimeNs

History

仅当将 bigint: true 传递给生成 对象的方法时才存在。 表示上次更改文件状态的时间戳,以自 POSIX 纪元以来的 纳秒数表示。

P

stats.birthtimeNs

History

仅当将 bigint: true 传递给生成 对象的方法时才存在。 表示此文件创建时间的时间戳,以自 POSIX 纪元以来的 纳秒数表示。

P

stats.atime

History

表示上次访问此文件的时间戳。

P

stats.mtime

History

表示上次修改此文件的时间戳。

P

stats.ctime

History

表示上次更改文件状态的时间戳。

P

stats.birthtime

History

表示此文件创建时间的时间戳。

atimeMsmtimeMsctimeMsbirthtimeMs 属性是 保存相应时间(毫秒)的数值。它们的 精度特定于平台。当将 bigint: true 传递给生成 对象的方法时,属性将是 bigints, 否则它们将是 numbers

atimeNsmtimeNsctimeNsbirthtimeNs 属性是 保存相应时间(纳秒)的 bigints。它们 仅当将 bigint: true 传递给生成 对象的方法时才存在。它们的精度特定于平台。

atimemtimectimebirthtime 是 各种时间的 Date 对象替代表示。 Date 和数值之间没有关联。分配新的数值,或 修改 Date 值,不会反映在相应的替代表示中。

stat 对象中的时间具有以下语义:

  • atime “访问时间”:上次访问文件数据的时间。由 mknod(2)utimes(2)read(2) 系统调用更改。
  • mtime “修改时间”:上次修改文件数据的时间。 由 mknod(2)utimes(2)write(2) 系统调用更改。
  • ctime “变更时间”:上次更改文件状态的时间 (inode 数据修改)。由 chmod(2)chown(2)link(2)mknod(2)rename(2)unlink(2)utimes(2)read(2)write(2) 系统调用更改。
  • birthtime “出生时间”:文件创建时间。文件 创建时设置一次。在不提供 birthtime 的文件系统上, 此字段可能保存 ctime1970-01-01T00:00Z(即 Unix 纪元时间戳 0)。在这种情况下,此值可能 大于 atimemtime。在 Darwin 和其他 FreeBSD 变体上, 如果使用 utimes(2) 系统调用将 atime 显式设置为早于当前 birthtime 的值,也会设置。

在 Node.js 0.12 之前,ctime 在 Windows 系统上保存 birthtime。从 0.12 开始,ctime 不是“创建时间”,在 Unix 系统上,从来都不是。

类:fs.StatFs

History

提供有关挂载的文件系统的信息。

fs.statfs() 及其同步对应物返回的对象属于 此类型。如果传递给这些方法的选项中的 biginttrue,则 数值将为 bigint 而不是 number

StatFs {
  type: 1397114950,
  bsize: 4096,
  frsize: 4096,
  blocks: 121938943,
  bfree: 61058895,
  bavail: 61058895,
  files: 999,
  ffree: 1000000
}

bigint 版本:

StatFs {
  type: 1397114950n,
  bsize: 4096n,
  frsize: 4096n,
  blocks: 121938943n,
  bfree: 61058895n,
  bavail: 61058895n,
  files: 999n,
  ffree: 1000000n
}
P

statfs.bavail

History
  • 类型:number | bigint

可供非特权用户使用的空闲块数。乘以 statfs.bsize 可得到可用字节数。

import { statfs } from 'node:fs/promises';

const stats = await statfs('/');
const availableBytes = stats.bsize * stats.bavail;
console.log(`可用空间:${availableBytes} 字节`);
const { statfs } = require('node:fs/promises');

(async () => {
  const stats = await statfs('/');
  const availableBytes = stats.bsize * stats.bavail;
  console.log(`可用空间:${availableBytes} 字节`);
})();
P

statfs.bfree

History
  • 类型:number | bigint

文件系统中的可用块数。乘以 statfs.bsize 可得到可用字节数。

import { statfs } from 'node:fs/promises';

const stats = await statfs('/');
const freeBytes = stats.bsize * stats.bfree;
console.log(`空闲空间:${freeBytes} 字节`);
const { statfs } = require('node:fs/promises');

(async () => {
  const stats = await statfs('/');
  const freeBytes = stats.bsize * stats.bfree;
  console.log(`空闲空间:${freeBytes} 字节`);
})();
P

statfs.blocks

History
  • 类型:number | bigint

文件系统中的数据块总数。乘以 statfs.bsize 可得 以字节为单位的总大小。

import { statfs } from 'node:fs/promises';

const stats = await statfs('/');
const totalBytes = stats.bsize * stats.blocks;
console.log(`总空间:${totalBytes} 字节`);
const { statfs } = require('node:fs/promises');

(async () => {
  const stats = await statfs('/');
  const totalBytes = stats.bsize * stats.blocks;
  console.log(`总空间:${totalBytes} 字节`);
})();
P

statfs.bsize

History
  • 类型:number | bigint

以字节为单位的最优传输块大小。

P

statfs.frsize

History
  • 类型:number | bigint

基本文件系统块大小。

P

statfs.ffree

History
  • 类型:number | bigint

文件系统中的空闲文件节点。

P

statfs.files

History
  • 类型:number | bigint

文件系统中的总文件节点。

P

statfs.type

History
  • 类型:number | bigint

文件系统类型。一个特定于平台的数值标识符,用于表示文件系统类型。此值对应于 POSIX 系统上 statfs(2) 返回的 f_type 字段(例如,Linux 上 ext4 对应 0xEF53)。其含义取决于操作系统,且不保证在不同平台之间一致。

类:fs.Utf8Stream

History

稳定性:1 - 实验性

一个优化的 UTF-8 流写入器,允许按需刷新所有内部缓冲区。它能正确处理 EAGAIN 错误,并允许 自定义行为,例如在磁盘繁忙时丢弃内容。

当流完全关闭时发出 'close' 事件。

当内部缓冲区已充分排空以允许继续写入时发出 'drain' 事件。

当达到最大长度且该数据将不会被写入时发出 'drop' 事件。被丢弃的数据作为第一个参数 传递给事件处理程序。

当发生错误时发出 'error' 事件。

当流已结束且所有数据都已刷新到底层文件时发出 'finish' 事件。

当流准备好接受写入时发出 'ready' 事件。

当写入操作完成时发出 'write' 事件。写入的字节数作为第一个参数传递给事件处理程序。

new fs.Utf8Stream(options?): void
Attributes
options:Object
append:
boolean 将写入追加到 dest 文件而不是截断它。 默认值 : true
contentMode:
string 您可以发送到 write 函数的数据类型,支持的值是 'utf8''buffer'默认值 : 'utf8'
dest:
string 要写入的文件的路径(模式由 append 选项控制)。
fd:
number 文件描述符,由 fs.open()fs.openSync() 返回的内容。
fs:
Object 具有与 fs 模块相同 API 的对象,有用 于模拟、测试或自定义流的行为。
fsync:
boolean 每次写入完成时执行 fs.fsyncSync()
maxLength:
number 内部缓冲区的最大长度。如果写入 操作会导致缓冲区超过 maxLength ,则写入的数据将被丢弃,并发出带有被丢弃数据的 drop 事件
maxWrite:
number 可以写入的最大字节数; 默认值 : 16384
minLength:
number 刷新前需要填满的内部缓冲区的最小长度。
mkdir:
boolean 当为 true 时确保 dest 文件的目录存在。 默认值 : false
mode:
number | string 指定创建文件模式(参见 fs.open() )。
periodicFlush:
numberperiodicFlush 毫秒调用 flush。
retryEAGAIN:Function
write()writeSync()flushSync() 遇到 EAGAINEBUSY 错误时将调用的函数。 如果返回值为 true 则将重试操作,否则将冒泡错误。 err 是导致调用此函数的错误, writeBufferLen 是已写入缓冲区的长度, remainingBufferLen 是流未尝试写入的剩余缓冲区的长度。
err:any
错误或 null
writeBufferLen:number
remainingBufferLen:
sync:
boolean 同步执行写入。
Attributes
流是追加到文件还是截断它。
Attributes
可以写入流的数据类型。支持 的值是 'utf8''buffer'默认值 : 'utf8'
utf8Stream.destroy(): void

立即关闭流,不刷新内部缓冲区。

utf8Stream.end(): void

优雅地关闭流,在关闭前刷新内部缓冲区。

Attributes
正在写入的文件描述符。
Attributes
正在写入的文件。
utf8Stream.flush(callback): void
Attributes
callback:Function
err:Error | null
如果刷新失败则为错误,否则为 null

如果写入未进行中,则将当前缓冲区写入文件。如果 minLength 为零或已经在写入,则不执行任何操作。

utf8Stream.flushSync(): void

同步刷新缓冲数据。这是一个昂贵的操作。

Attributes
流是否在每次 写入操作后执行 fs.fsyncSync()
Attributes
内部缓冲区的最大长度。如果写入 操作会导致缓冲区超过 maxLength ,则写入的数据将被丢弃,并发出带有被丢弃数据的 drop 事件。
Attributes
刷新前需要填满的内部缓冲区的最小长度。
Attributes
流是否应确保 dest 文件的目录存在。如果为 true ,如果目录不存在则创建它。 默认值 : false
Attributes
number | string
正在写入的文件的模式。
Attributes
刷新之间的毫秒数。如果设置为 0 ,则不会执行定期刷新。
utf8Stream.reopen(file): void
  • file: string | Buffer | URL 要写入的文件的路径(模式 由 append 选项控制)。

就地重新打开文件,适用于日志轮转。

Attributes
流是同步写入还是异步写入。
utf8Stream.write(data): void
Attributes
data:string | Buffer
要写入的数据。

当创建流时将 options.contentMode 设置为 'utf8' 时, data 参数必须是字符串。如果 contentMode 设置为 'buffer', 则 data 参数必须是 Buffer

Attributes
流是否正在向文件写入数据。
utf8Stream[Symbol.dispose](): void

调用 utf8Stream.destroy()

此方法支持将流与 using 一起使用,当作用域退出时, 该语句会自动销毁流。有关更多信息,请参阅 MDN 关于 using 语句的文档

类:fs.WriteStream

History
  • 继承 stream.Writable

fs.WriteStream 的实例不能直接构造。它们是使用 fs.createWriteStream() 函数创建并返回的。

事件:'close'

History

fs.WriteStream 的底层文件描述符已关闭时发出。

事件:'open'

History
Attributes
fs.WriteStream 使用的整数文件描述符。

fs.WriteStream 的文件已打开时发出。

事件:'ready'

History

fs.WriteStream 准备好使用时发出。

'open' 之后立即触发。

P

writeStream.bytesWritten

History

到目前为止写入的字节数。不包括仍在排队等待写入的数据。

M

writeStream.close

History
writeStream.close(callback?): void
Attributes
callback:Function
err:Error

关闭 writeStream。可选地接受一个回调,在 writeStream 关闭后执行。

P

writeStream.path

History

流正在写入的文件路径,如 fs.createWriteStream() 的第一个 参数中所指定。如果将 path 作为字符串传递,则 writeStream.path 将是字符串。如果将 path 作为 Buffer 传递,则 writeStream.path 将是 Buffer

P

writeStream.pending

History

如果底层文件尚未打开,即在发出 'ready' 事件之前,此 属性为 true

返回一个包含文件系统操作常用常量的对象。

以下常量由 fs.constantsfsPromises.constants 导出。

并非每个常量在每个操作系统上都可用; 这对于 Windows 尤其重要,其中许多 POSIX 特定 定义不可用。 对于可移植应用程序,建议在使用前检查它们是否存在。

要使用多个常量,请使用按位 OR | 运算符。

示例:

import { open, constants } from 'node:fs';

const {
  O_RDWR,
  O_CREAT,
  O_EXCL,
} = constants;

open('/path/to/my/file', O_RDWR | O_CREAT | O_EXCL, (err, fd) => {
  // ...
});

以下常量旨在用作传递给 fsPromises.access()fs.access()fs.accessSync()mode 参数。

常量 描述
F_OK 标志,指示文件对调用进程可见。 这对于确定文件是否存在很有用,但不说明 rwx 权限。如果未指定模式,则为默认值。
R_OK 标志,指示文件可由调用进程读取。
W_OK 标志,指示文件可由调用 进程写入。
X_OK 标志,指示文件可由调用 进程执行。这在 Windows 上没有效果 (将表现为 fs.constants.F_OK)。

这些定义在 Windows 上也可用。

以下常量旨在与 fs.copyFile() 一起使用。

常量 描述
COPYFILE_EXCL 如果存在,如果目标路径已存在,则复制操作将失败并报错。
COPYFILE_FICLONE 如果存在,复制操作将尝试创建 写时复制 reflink。如果底层平台不支持 写时复制,则使用回退复制机制。
COPYFILE_FICLONE_FORCE 如果存在,复制操作将尝试创建 写时复制 reflink。如果底层平台不支持 写时复制,则操作将失败并报错。

这些定义在 Windows 上也可用。

以下常量旨在与 fs.open() 一起使用。

常量 描述
O_RDONLY 标志,指示以只读方式打开文件。
O_WRONLY 标志,指示以只写方式打开文件。
O_RDWR 标志,指示以读写方式打开文件。
O_CREAT 标志,指示如果文件不存在则创建文件。
O_EXCL 标志,指示如果设置了 O_CREAT 标志且文件已存在,则打开文件应失败。
O_NOCTTY 标志,指示如果路径标识终端设备,打开路径不应导致该终端成为进程的控制终端(如果进程还没有控制终端)。
O_TRUNC 标志,指示如果文件存在且是常规文件,并且文件成功打开以进行写入访问,则其长度应截断为零。
O_APPEND 标志,指示数据将追加到文件末尾。
O_DIRECTORY 标志,指示如果路径不是目录,则打开应失败。
O_NOATIME 标志,指示对文件系统的读取访问将不再导致与文件关联的 atime 信息更新。此标志仅在 Linux 操作系统上可用。
O_NOFOLLOW 标志,指示如果路径是符号链接,则打开应失败。
O_SYNC 标志,指示文件打开用于同步 I/O,写入操作等待文件完整性。
O_DSYNC 标志,指示文件打开用于同步 I/O,写入操作等待数据完整性。
O_SYMLINK 标志,指示打开符号链接本身而不是它指向的资源。
O_DIRECT 设置时,将尝试最小化文件 I/O 的缓存效果。
O_NONBLOCK 标志,指示在可能时以非阻塞模式打开文件。
UV_FS_O_FILEMAP 设置时,使用内存文件映射来访问文件。此标志 仅在 Windows 操作系统上可用。在其他操作系统上, 此标志被忽略。
UV_FS_O_TEMPORARY 设置时,当指向该文件的最后一个句柄关闭时,文件将自动删除。此标志仅在 Windows 操作系统上可用。在其他操作系统上,此标志将被忽略。
UV_FS_O_SHORT_LIVED 提示文件的生命周期较短,因此系统会尽可能避免将其刷新到磁盘。此标志仅在 Windows 操作系统上可用。在其他操作系统上,此标志将被忽略。
UV_FS_O_SEQUENTIAL 提示文件将从头到尾按顺序访问,以优化缓存。此标志仅在 Windows 操作系统上可用。在其他操作系统上,此标志将被忽略。
UV_FS_O_RANDOM 提示文件将以随机方式访问,以优化缓存。此标志仅在 Windows 操作系统上可用。在其他操作系统上,此标志将被忽略。

在 Windows 上,只有 O_APPENDO_CREATO_EXCLO_RDONLYO_RDWRO_TRUNCO_WRONLYUV_FS_O_FILEMAPUV_FS_O_TEMPORARYUV_FS_O_SHORT_LIVEDUV_FS_O_SEQUENTIALUV_FS_O_RANDOM 可用。

以下常量旨在与 fs.Stats 对象的 mode 属性一起使用,以确定文件类型。

常量 描述
S_IFMT 用于提取文件类型代码的位掩码。
S_IFREG 常规文件的文件类型常量。
S_IFDIR 目录的文件类型常量。
S_IFCHR 面向字符的设备文件的文件类型常量。
S_IFBLK 面向块的设备文件的文件类型常量。
S_IFIFO FIFO/管道的文件类型常量。
S_IFLNK 符号链接的文件类型常量。
S_IFSOCK 套接字的文件类型常量。

在 Windows 上,只有 S_IFCHRS_IFDIRS_IFLNKS_IFMTS_IFREG 可用。

以下常量旨在与 fs.Stats 对象的 mode 属性一起使用,以确定文件的访问权限。

常量 描述
S_IRWXU 文件模式,指示所有者可读、可写和可执行。
S_IRUSR 文件模式,指示所有者可读。
S_IWUSR 文件模式,指示所有者可写。
S_IXUSR 文件模式,指示所有者可执行。
S_IRWXG 文件模式,指示组可读、可写和可执行。
S_IRGRP 文件模式,指示组可读。
S_IWGRP 文件模式,指示组可写。
S_IXGRP 文件模式,指示组可执行。
S_IRWXO 文件模式,指示其他人可读、可写和可执行。
S_IROTH 文件模式,指示其他人可读。
S_IWOTH 文件模式,指示其他人可写。
S_IXOTH 文件模式,指示其他人可执行。

在 Windows 上,只有 S_IRUSRS_IWUSR 可用。

因为它们由底层线程池异步执行, 所以使用回调或基于 Promise 的方法时没有保证的顺序。

例如,以下内容容易出错,因为 fs.stat() 操作可能在 fs.rename() 操作之前完成:

const fs = require('node:fs');

fs.rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  console.log('重命名完成');
});
fs.stat('/tmp/world', (err, stats) => {
  if (err) throw err;
  console.log(`统计信息: ${JSON.stringify(stats)}`);
});

重要的是通过等待一个操作的结果再调用另一个操作来正确排序操作:

import { rename, stat } from 'node:fs/promises';

const oldPath = '/tmp/hello';
const newPath = '/tmp/world';

try {
  await rename(oldPath, newPath);
  const stats = await stat(newPath);
  console.log(`统计信息: ${JSON.stringify(stats)}`);
} catch (error) {
  console.error('发生错误:', error.message);
}
const { rename, stat } = require('node:fs/promises');

(async function(oldPath, newPath) {
  try {
    await rename(oldPath, newPath);
    const stats = await stat(newPath);
    console.log(`统计信息: ${JSON.stringify(stats)}`);
  } catch (error) {
    console.error('发生错误:', error.message);
  }
})('/tmp/hello', '/tmp/world');

或者,当使用回调 API 时,将 fs.stat() 调用移入 fs.rename() 操作的回调中:

import { rename, stat } from 'node:fs';

rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  stat('/tmp/world', (err, stats) => {
    if (err) throw err;
    console.log(`统计信息: ${JSON.stringify(stats)}`);
  });
});
const { rename, stat } = require('node:fs');

rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  stat('/tmp/world', (err, stats) => {
    if (err) throw err;
    console.log(`统计信息: ${JSON.stringify(stats)}`);
  });
});

大多数 fs 操作接受文件路径,这些路径可以指定为 字符串、Buffer 或使用 file: 协议的 URL 对象。

字符串路径被解释为标识绝对或相对文件名的 UTF-8 字符序列。相对路径将相对于 由调用 process.cwd() 确定的当前工作目录进行解析。

在 POSIX 上使用绝对路径的示例:

import { open } from 'node:fs/promises';

let fd;
try {
  fd = await open('/open/some/file.txt', 'r');
  // 对文件执行某些操作
} finally {
  await fd?.close();
}

在 POSIX 上使用相对路径的示例(相对于 process.cwd()):

import { open } from 'node:fs/promises';

let fd;
try {
  fd = await open('file.txt', 'r');
  // 对文件执行某些操作
} finally {
  await fd?.close();
}

文件 URL 路径

History

对于大多数 node:fs 模块函数,pathfilename 参数可以 作为使用 file: 协议的 URL 对象传递。

import { readFileSync } from 'node:fs';

readFileSync(new URL('file:///tmp/hello'));

file: URL 始终是绝对路径。

在 Windows 上,带有主机名的 file: URL 转换为 UNC 路径,而带有驱动器号的 file: URL 转换为本地绝对路径。没有主机名且没有驱动器号的 file: URL 将导致错误:

import { readFileSync } from 'node:fs';
// 在 Windows 上:

// - 带有主机名的 WHATWG 文件 URL 转换为 UNC 路径
// file://hostname/p/a/t/h/file => \\hostname\p\a\t\h\file
readFileSync(new URL('file://hostname/p/a/t/h/file'));

// - 带有驱动器号的 WHATWG 文件 URL 转换为绝对路径
// file:///C:/tmp/hello => C:\tmp\hello
readFileSync(new URL('file:///C:/tmp/hello'));

// - 没有主机名的 WHATWG 文件 URL 必须具有驱动器号
readFileSync(new URL('file:///notdriveletter/p/a/t/h/file'));
readFileSync(new URL('file:///c/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: 文件 URL 路径必须是绝对的

带有驱动器号的 file: URL 必须使用 : 作为分隔符,紧跟在 驱动器字母之后。使用其他分隔符将导致错误。

在所有其他平台上,带有主机名的 file: URL 不受支持并 将导致错误:

import { readFileSync } from 'node:fs';
// 在其他平台上:

// - 不支持带有主机名的 WHATWG 文件 URL
// file://hostname/p/a/t/h/file => 抛出!
readFileSync(new URL('file://hostname/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: 必须是绝对的

// - WHATWG 文件 URL 转换为绝对路径
// file:///tmp/hello => /tmp/hello
readFileSync(new URL('file:///tmp/hello'));

具有编码斜杠字符的 file: URL 将在所有 平台上导致错误:

import { readFileSync } from 'node:fs';

// 在 Windows 上
readFileSync(new URL('file:///C:/p/a/t/h/%2F'));
readFileSync(new URL('file:///C:/p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: 文件 URL 路径不能包含编码的
\ 或 / 字符 */

// 在 POSIX 上
readFileSync(new URL('file:///p/a/t/h/%2F'));
readFileSync(new URL('file:///p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: 文件 URL 路径不能包含编码的
/ 字符 */

在 Windows 上,具有编码反斜杠的 file: URL 将导致错误:

import { readFileSync } from 'node:fs';

// 在 Windows 上
readFileSync(new URL('file:///C:/path/%5C'));
readFileSync(new URL('file:///C:/path/%5c'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: 文件 URL 路径不能包含编码的
\ 或 / 字符 */

使用 Buffer 指定的路径主要在某些 POSIX 操作系统上有用,这些系统将文件路径视为不透明字节序列。在此类 系统上,单个文件路径可能包含使用多种字符编码的子序列。与字符串路径一样,Buffer 路径可以 是相对的或绝对的:

在 POSIX 上使用绝对路径的示例:

import { open } from 'node:fs/promises';
import { Buffer } from 'node:buffer';

let fd;
try {
  fd = await open(Buffer.from('/open/some/file.txt'), 'r');
  // 对文件执行某些操作
} finally {
  await fd?.close();
}

在 Windows 上,Node.js 遵循每驱动器工作目录的概念。当 使用不带反斜杠的驱动器路径时可以观察到这种行为。例如 fs.readdirSync('C:\\') 可能返回与 fs.readdirSync('C:') 不同的结果。更多信息,请参阅 此 MSDN 页面

在 POSIX 系统上,对于每个进程,内核维护一个当前 打开文件和资源的表。每个打开的文件被分配一个简单的数字 标识符,称为_文件描述符_。在系统级别,所有文件 系统操作都使用这些文件描述符来标识和跟踪每个特定 文件。Windows 系统使用不同但概念上相似的机制来 跟踪资源。为了简化用户操作,Node.js 抽象了 操作系统之间的差异,并为所有打开的文件分配一个数字文件 描述符。

基于回调的 fs.open() 和同步的 fs.openSync() 方法打开 文件并分配一个新的文件描述符。一旦分配,文件描述符可 用于从文件读取数据、向文件写入数据或请求有关文件的信息。

操作系统限制任何给定时间可以打开的文件描述符数量,因此在操作 完成时关闭描述符至关重要。未能这样做将导致内存泄漏,最终 导致应用程序崩溃。

import { open, close, fstat } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('/open/some/file.txt', 'r', (err, fd) => {
  if (err) throw err;
  try {
    fstat(fd, (err, stat) => {
      if (err) {
        closeFd(fd);
        throw err;
      }

      // 使用 stat

      closeFd(fd);
    });
  } catch (err) {
    closeFd(fd);
    throw err;
  }
});

基于 Promise 的 API 使用 FileHandle 对象代替数字文件描述符。这些对象由系统更好地管理,以确保资源不被泄漏。但是,仍然要求在操作完成时关闭它们:

import { open } from 'node:fs/promises';

let file;
try {
  file = await open('/open/some/file.txt', 'r');
  const stat = await file.stat();
  // 使用 stat
} finally {
  await file.close();
}

所有基于回调和 Promise 的文件系统 API(fs.FSWatcher() 除外)都使用 libuv 的线程池。这可能会对一些应用程序产生令人惊讶且负面的 性能影响。请参阅 UV_THREADPOOL_SIZE 文档以获取更多信息。

无论何时 flag 选项接受字符串,以下标志都可用。

  • 'a': 打开文件以追加。 如果文件不存在则创建。

  • 'ax': 类似 'a',但如果路径存在则失败。

  • 'a+': 打开文件以读取和追加。 如果文件不存在则创建。

  • 'ax+': 类似 'a+',但如果路径存在则失败。

  • 'as': 以同步模式打开文件以追加。 如果文件不存在则创建。

  • 'as+': 以同步模式打开文件以读取和追加。 如果文件不存在则创建。

  • 'r': 打开文件以读取。 如果文件不存在则发生异常。

  • 'rs': 以同步模式打开文件以读取。 如果文件不存在则发生异常。

  • 'r+': 打开文件以读取和写入。 如果文件不存在则发生异常。

  • 'rs+': 以同步模式打开文件以读取和写入。指示 操作系统绕过本地文件系统缓存。

    这主要用于打开 NFS 挂载上的文件,因为它允许 跳过可能过时的本地缓存。它对 I/O 性能有非常实际的影响,因此除非需要,否则不建议使用此标志。

    这不会将 fs.open()fsPromises.open() 变成同步 阻塞调用。如果需要同步操作,应使用类似 fs.openSync() 的方法。

  • 'w': 打开文件以写入。 文件被创建(如果不存在)或截断(如果存在)。

  • 'wx': 类似 'w',但如果路径存在则失败。

  • 'w+': 打开文件以读取和写入。 文件被创建(如果不存在)或截断(如果存在)。

  • 'wx+': 类似 'w+',但如果路径存在则失败。

flag 也可以是 open(2) 文档中记录的数字;常用常量 可从 fs.constants 获取。在 Windows 上,标志在适用的情况下被翻译为其等价标志,例如 O_WRONLYFILE_GENERIC_WRITE, 或 O_EXCL|O_CREATCREATE_NEW,如同 CreateFileW 所接受的那样。

独占标志 'x'open(2) 中的 O_EXCL 标志)会导致操作在路径已存在时 返回错误。在 POSIX 上,如果路径是符号 链接,使用 O_EXCL 即使链接指向不存在的路径也会返回错误。独占标志可能不适用于网络文件系统。

在 Linux 上,当文件以追加模式打开时,定位写入不起作用。 内核忽略位置参数并始终将数据追加到 文件末尾。

修改文件而不是替换它可能需要将 flag 选项设置 为 'r+' 而不是默认的 'w'

某些标志的行为是特定于平台的。因此,在 macOS 和 Linux 上使用 'a+' 标志打开目录 (如下例所示)将返回一个 错误。相比之下,在 Windows 和 FreeBSD 上,将返回文件描述符或 FileHandle

// macOS 和 Linux
fs.open('<directory>', 'a+', (err, fd) => {
  // => [Error: EISDIR: 对目录的非法操作,open <directory>]
});

// Windows 和 FreeBSD
fs.open('<directory>', 'a+', (err, fd) => {
  // => null, <fd>
});

在 Windows 上,使用 'w' 标志(通过 fs.open()fs.writeFile()fsPromises.open())打开现有的隐藏文件将失败并返回 EPERM。现有的隐藏文件可以使用 'r+' 标志打开以进行写入。

调用 fs.ftruncate()filehandle.truncate() 可用于重置 文件内容。