文件 I/O fs:readFile/writeFile/stat/isDirectory/isFile/readdir/mkdir/exists

文件 I/O

Sync 函数是同步的,会阻塞,极其影响性能, 通常在程序启动时运行有限的次数即可.

I/O

I/O: input ouput 输入输出

对外部设备的输入输出

外部设备: 磁盘 网卡 显卡 打印机

对外部数据进行传输就叫做 I/O

I/O 的速度往往低于内存和 CPU 的交互速度

fs 模块

https://nodejs.org/dist/latest-v12.x/docs/api/fs.html

readFile 读取文件

readFile 读取文件

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

// './cs.txt', 相对路径 相对于 运行命令运行目录
// 一般使用绝对路径
const filename = path.resolve(__dirname, "./cs.txt");

fs.readFile(filename, (err, data) => {
  // data 是 buffer  可通过 data.toString('utf-8') 转换为文字
});

// 把文本转换为 "utf-8"
fs.readFile(filename, "utf-8", (err, data) => {
  console.log("读取文件内容:", data, path.resolve("./cs.txt"));
});

fs.readFile(
  filename,
  {
    encoding: "utf-8",
  },
  (err, data) => {
    console.log("读取文件内容:", data, path.resolve("./cs.txt"));
  }
);

readFileSync 同步读取文件

var filetext = fs.readFileSync(filename, "utf-8");
console.log("读取文件内容:", filetext);

返回一个 promise 对象

fs.promises.readFile(filename, "utf-8");

writeFile 写入文件

目录如果不存在,会抛出错误
文件不存在,会创建文件

fs.writeFile(path, config, callback);
/**
 * writeFile 写入文件
 */

const os = require("os");
const fs = require("fs");
const path = require("path");
const filename = path.resolve(__dirname, "./cs.txt");

async function writeFile(filename, text) {
  /**
   * 参数:
   * 文件路径
   * 内容
   * 编码:默认utf-8
   */
  // 会覆盖内容
  // await fs.promises.writeFile(filename, text)

  // 往后面添加
  // os.EOL 换行兼容不同的操作系统
  // await fs.promises.writeFile(filename, os.EOL + text, {
  //     flag: 'a', // a==>append 追加
  // })

  // 使用 Buffer
  const buffer = Buffer.from(text, "utf-8");
  await fs.promises.writeFile(filename, buffer);

  console.log("write success");
}

writeFile(filename, "写入文件内容 dffff");

实现复制文件

/**
 * 复制文件 不使用 fs.copyFile
 */

const fs = require("fs");
const path = require("path");
const filename = path.resolve(__dirname, "./img/xyz.jpg");
const writeFilename = path.resolve(__dirname, "./img/xyz.copy.jpg");
/**
 * copyFile 复制文件
 *
 * @param {*} readPath 文件读取路径
 * @param {*} writePath 写入路径
 */
async function copyFile(readPath, writePath) {
  const buffer = await fs.promises.readFile(readPath);
  await fs.promises.writeFile(writePath, buffer);
  console.log("\x1B[42m%s\x1B[49m", "copyFile success");
}

copyFile(filename, writeFilename);

文件 I/O fs:readFile/writeFile/stat/isDirectory/isFile/readdir/mkdir/exists

fs.stat 获取目录中的文件和子目录信息

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

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

async function stat(filename) {
  const result = await fs.promises.stat(filename);
  console.log(result);
  console.log("创建时间:", result.birthtime.toLocaleDateString());
}
stat(filename);

文件状态信息

{
  size: 占用字节数;
  atime: 上一次访问的时间戳;
  mtime: 上一次修改文件的时间戳;
  ctime: 上一次改变文件状态的时间戳; // 如访问权限
  birthtime: 文件创建时间戳;
}

文件 I/O fs:readFile/writeFile/stat/isDirectory/isFile/readdir/mkdir/exists
目录信息

size:0; 目录在操作系统中实际上是一个非常小的文件,里面记录了一些指针,指向其他文件的位置。

文件 I/O fs:readFile/writeFile/stat/isDirectory/isFile/readdir/mkdir/exists

isDirectory()/isFile()

isDirectory 判断是否是文件夹
isFile 判断是否是文件

const fs = require("fs");
const path = require("path");
const filename = path.resolve(__dirname, "./文件夹/cs.txt");
const filedir = path.resolve(__dirname, "./文件夹");

console.log(fs.isDirectory(filename)); // false
console.log(fs.isDirectory(filedir)); // true
console.log(fs.isFile(filename)); // true
console.log(fs.isFile(filedir)); // false

readdir 读取目录

const fs = require("fs");
const path = require("path");
const filedir = path.resolve(__dirname, "./复制文件");

async function readdir(dirPath) {
  const result = await fs.promises.readdir(dirPath);
  console.log("result", result);
  // [ 'copyFile.js', 'img']
}
readdir(filedir);

mkdir 创建目录

const fs = require("fs");
const path = require("path");
const filedir = path.resolve(__dirname, "./目录");

async function readdir(dirPath) {
  await fs.promises.mkdir(dirPath);
}
readdir(filedir);

exists 判断文件或目录是否存在

fs.exists(path, callback) 过时了,只支持回调方式

自己封装

const fs = require("fs");
const path = require("path");
const filedir = path.resolve(__dirname, "./xxx/xx");

async function exists(filename) {
  try {
    await fs.promises.stat(filename);
    return true;
  } catch (err) {
    if (err.code === "ENOENT") {
      // 文件不存在
      return false;
    }
    // 其他错误正常抛出
    throw err;
  }
}
exists(filedir).then((res) => {
  console.log(res);
});

可以配合 mkdir 判断目录是否存在,不存在就创建目录

上一篇:读懂,查询选修了全部课程的学生姓名


下一篇:SQL中EXISTS的用法