Skip to content
0

node:fs

NodeJs 的文件模块,最常用的模块之一

文件权限

fs.access 可以测试当前用户对某个目录的权限。第一个参数是要测试的目录,第二个参数 mode 来自 fs 模块导出的常量 constants,采用二次幂权限设计,所以可以用并集叠加权限。

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

try {
  await access('/etc/passwd', constants.R_OK | constants.W_OK);
  console.log('can access');
} catch {
  console.error('cannot access');
}

access 第二个参数默认是 constants.F_OK,即检查文件是否存在

  • F_OK:是否存在
  • R_OK:可读
  • W_OK:可写
  • X_OK:可执行
constants 的所有值
{
    UV_FS_SYMLINK_DIR: 1,
    UV_FS_SYMLINK_JUNCTION: 2,
    O_RDONLY: 0,
    O_WRONLY: 1,
    O_RDWR: 2,
    UV_DIRENT_UNKNOWN: 0,
    UV_DIRENT_FILE: 1,
    UV_DIRENT_DIR: 2,
    UV_DIRENT_LINK: 3,
    UV_DIRENT_FIFO: 4,
    UV_DIRENT_SOCKET: 5,
    UV_DIRENT_CHAR: 6,
    UV_DIRENT_BLOCK: 7,
    S_IFMT: 61440,
    S_IFREG: 32768,
    S_IFDIR: 16384,
    S_IFCHR: 8192,
    S_IFBLK: 24576,
    S_IFIFO: 4096,
    S_IFLNK: 40960,
    S_IFSOCK: 49152,
    O_CREAT: 512,
    O_EXCL: 2048,
    UV_FS_O_FILEMAP: 0,
    O_NOCTTY: 131072,
    O_TRUNC: 1024,
    O_APPEND: 8,
    O_DIRECTORY: 1048576,
    O_NOFOLLOW: 256,
    O_SYNC: 128,
    O_DSYNC: 4194304,
    O_SYMLINK: 2097152,
    O_NONBLOCK: 4,
    S_IRWXU: 448,
    S_IRUSR: 256,
    S_IWUSR: 128,
    S_IXUSR: 64,
    S_IRWXG: 56,
    S_IRGRP: 32,
    S_IWGRP: 16,
    S_IXGRP: 8,
    S_IRWXO: 7,
    S_IROTH: 4,
    S_IWOTH: 2,
    S_IXOTH: 1,
    F_OK: 0,
    R_OK: 4,
    W_OK: 2,
    X_OK: 1,
    UV_FS_COPYFILE_EXCL: 1,
    COPYFILE_EXCL: 1,
    UV_FS_COPYFILE_FICLONE: 2,
    COPYFILE_FICLONE: 2,
    UV_FS_COPYFILE_FICLONE_FORCE: 4,
    COPYFILE_FICLONE_FORCE: 4
}

可以用于检查一些所在目录权限较高的文件,或者是像 .pem 这种结尾的加密的文件

统计信息

使用 fs.stat 可以获得文件的统计信息

import { statSync } from "fs";

console.log(
  statSync('./index.ts')
) //=> {...}

返回的重要的字段,尤其是可以通过 size 读取到文件的大小:

  • size:文件的大小,单位为字节
  • mode:文件权限和类型的掩码
  • birthtime:文件创建的时间的 JS 对象时间戳
  • aTime:文件最后访问时间的 JS 对象时间戳
  • mTime:文件最后修改时间的 JS 对象时间戳
所有字段
 {
  dev: 16777232,
  mode: 16877,
  nlink: 14,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 750776,
  size: 448,
  blocks: 0,
  atimeMs: 1699370220110.4724,
  mtimeMs: 1699370220098.3525,
  ctimeMs: 1699370220098.3525,
  birthtimeMs: 1699284946242.8271,
  atime: 2023-11-07T15:17:00.110Z,
  mtime: 2023-11-07T15:17:00.098Z,
  ctime: 2023-11-07T15:17:00.098Z,
  birthtime: 2023-11-06T15:35:46.243Z
}

Released under the MIT License.