Node(文件I/O)

45 阅读3分钟

I/O:input output

对外部设备的输入输出

外部设备

  • 磁盘
  • 网卡
  • 显卡
  • 打印机
  • 其他

IO的速度往往低于内存和CPU的交互速度

fs模块

读取一个文件 fs.readFile

const fs = require("fs");
const path = require("path");

const filename = path.resolve(__dirname, "./myfiles/1.txt");
fs.readFile(filename,"utf-8", (err, content) => {
    console.log(content);
});

为什么执行回调函数:读取文件需要时间,I/O的处理时间远远大于内存与cpu之间的交互时间,如果同步写法,代码会卡住

同步写法fs.readFileSync(filename,"utf-8") (不建议这样,有时候会等待时间过长)(一般Sync在程序启动时运行有限的次数即可使用)

ES6新写法

async function test() {
  const content =await fs.promises.readFile(filename,"utf-8");
  console.log(content);
}

test();

向文件写入内容 fs.writeFile

fs.writeFile(filename, data[, options], callback)

  • filename:写入文件路径
  • data[String | Buffer]:写入内容
  • options:- 可选参数,包含以下属性:
    • encoding (String) :指定写入数据的编码,默认为 'utf8'。
    • mode (Number) :指定文件的权限,默认为 0o666(即 438)。
    • flag (String) :指定文件打开的行为,默认为 'w',表示覆盖写入。其他常见值包括 'a'(追加写入)和 'x'(如果文件存在则失败)。
  • callback (Function) :必选参数,回调函数,接收一个参数 err,在写入失败时返回错误对象,成功时 err 为 null
const fs = require("fs");
const path = require("path");

const filename = path.resolve(__dirname, "./myfiles/2.txt");

async function test() {
    // await fs.promises.writeFile(filename, "阿斯顿发发放到发", {
    //    flag: "a"    // 追加内容
    // });
    const buffer = Buffer.from("abcde", "utf-8");
    await fs.promises.writeFile(filename, buffer);
    console.log("写入成功");
}

test();

注意:如果文件不存在,会自动创建一个,但是目录不存在会报错

获取文件或目录信息 fs.stat

s.stat 是 Node.js 文件系统(fs)模块中的一个方法,用于获取文件或目录的详细信息。它返回一个 stats 对象,该对象包含关于文件或目录的各种元数据

  • size: 占用字节
  • atime: 上次访问时间
  • mtime: 上次文件内容被修改时间
  • ctime: 上次文件状态被修改时间
  • birthtime: 文件创建时间
  • isDirectory(): 判断是否是目录
  • isFile(): 判断是否是文件 示例
const fs = require('fs');

fs.stat('example.txt', (err, stats) => {
    if (err) {
        console.error('发生错误:', err);
        return;
    }

    if (stats.isFile()) {
        console.log('这是一个文件');
    } else if (stats.isDirectory()) {
        console.log('这是一个目录');
    } else {
        console.log('这是其他类型的文件系统对象');
    }
});

获取目录中的文件和子目录 fs.readdir

fs.readdir 用于读取指定目录的内容,返回该目录下的所有文件和子目录的列表。

const fs = require('fs');

fs.readdir('./my-directory', 'utf8', (err, files) => {
    if (err) {
        console.error('读取目录失败:', err);
        return;
    }
    console.log('目录内容:', files);
});

创建目录 fs.mkdir

fs.mkdir 用于创建新目录。如果父目录不存在,可以通过设置选项来递归创建。

const fs = require('fs');

// 创建单层目录
fs.mkdir('./new-directory', '0755', (err) => {
    if (err) {
        console.error('创建目录失败:', err);
        return;
    }
    console.log('目录创建成功');
});

// 创建多层目录(递归)
fs.mkdir('./parent-directory/child-directory', { recursive: true }, (err) => {
    if (err) {
        console.error('创建目录失败:', err);
        return;
    }
    console.log('多层目录创建成功');
});

判断文件或目录是否存在 fs.access

fs.access 用于检查文件或目录是否存在,并验证其权限。

const fs = require('fs');

// 检查文件或目录是否存在
fs.access('./example.txt', fs.constants.F_OK, (err) => {
    if (err) {
        console.error('文件或目录不存在');
    } else {
        console.log('文件或目录存在');
    }
});

// 检查文件是否可读
fs.access('./example.txt', fs.constants.R_OK, (err) => {
    if (err) {
        console.error('文件不可读');
    } else {
        console.log('文件可读');
    }
});