Node.js

fs

// 文件系统 Filesystem

返回目录
// 文件系统 Filesystem

const fs = require("fs");

// 一、 写入

// 1. 异步
// fs.writeFile(文件路径, 写入内容, [选项], 回调)
// 选项 :  flag: 'a' 追加模式  'w'写入,默认值

fs.writeFile(
  "./hello.txt",
  "异步创建了文件\n",
  {
    flag: "a"
  },
  err => {
    if (err) {
      console.log(err);
      return;
    }
    console.log("异步写入完成");
  }
);

// 2. 同步
fs.writeFileSync("./同步.txt", "同步写入!!!", { flag: "a" });
console.log("同步写入完成");

// 二、 读取

// 在读取较小的文件时推荐使用
// fs.readFile(文件路径,[解码方式,默认buffer,可写成'utf-8'],回调)
fs.readFile("./hello.txt", "utf-8", (err, data) => {
  // if (err) return;   //键哥
  if (err) throw err; //宇哥
  // data 默认是Buffer数据,二进制数据(展示出来的是十六进制)
  // data.toString() 转为字符串形式
  // console.log(data.toString());
  console.log("readFile方法读取", data);
});

// fs.open 方法英语分配新的文件描述符, 一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据、或请求关于文件的信息。
fs.open("./hello.txt", "a+", (err, fd) => {
  if (err) throw err;
  console.log(fd);
  let buf = Buffer.alloc(255);
  fs.read(fd, buf, 0, 15, null, (err, bytesRead, buffer) => {
    if (err) throw err;
    console.log("read", buffer.toString());
  });
  let buf1 = Buffer.from("追加的内容");

  fs.write(fd, buf1, (err, bytesRead, buffer) => {
    if (err) throw err;
    console.log("追加完成");
  });
  fs.close(fd, () => {
    console.log("描述符已关闭");
  });
});

// 三、 改名

fs.rename("./hello.txt", "./hello word.txt", err => {
  if (err) return;
  console.log("重命名完成");
});

//流

// 四、 可读流 可写流
//  <buffer 61 62 63>
let bigFile = fs.createWriteStream("./bigFile.txt"); //创建可写流

for (let i = 0; i < 1e6; i++) {
  bigFile.write("小伙子 你也是复读机 \n");
}

bigFile.end(); //关闭流

let readStream = fs.createReadStream("./bigFile.txt");
let writeStream = fs.createWriteStream("./writeMe.txt");

readStream.pipe(writeStream);
writeStream.on("open", () => {
  console.log("正在通过管道");
});

自动生成目录

// 读取当前目录
fs.readdir("./", (err, files) => {
  if (err) throw err;
  let summary = "";
  // 遍历目录中文件名
  files.forEach(file => {
    fs.stat(file, (err, stats) => {
      console.log(file, "是目录", stats.isDirectory());
    });
    // 提取文件名
    let name = path.parse(file).name;
    summary += `* [${name}](${file})\n`;
  });
  fs.writeFile("./summary.md", summary, err => {
    if (err) throw err;
    console.log("目录已生成");
  });
});
// 遍历目录多层结构 ---> 深拷贝(原理一致)