Node模块记录-fs模块(文件操作)

550 阅读4分钟
  • 个人学习记录,如有问题,欢迎各位大佬指出
  • 在新版的Node.js中,许多异步API都支持Promise方式。这意味着可以使用Promise来处理异步操作,而不再依赖于回调函数

1、写入文件

const fs = require("fs");
/**
 * writeFile 异步写入文件
 * @param {string} path - 文件路径
 * @param {string | Buffer} data - 写入的内容
 * @param {(Error | null) => void} callback - 回调函数,写入完成后调用
 * @returns {void}
 */
// https://www.geeksforgeeks.org/node-js-fs-writefile-method/ 第三个参数为options(对象或字符串),可选项,如果没有则走回调
fs.writeFile("./demo.txt", "我是fs.writeFile写入的内容哦", err => {
  // 写入失败 err为一个错误对象
  if (err) return console.log("writeFile写入失败", err);
  // 写入成功 err为null
  console.log("writeFile写入成功", err);
});

/**
 * writeFileSync 同步写入文件
 * @param {string} path - 文件路径
 * @param {string | Buffer} data - 写入的内容
 * @returns {void}
 */
fs.writeFileSync("./胖虎.js", "我是fs.writeFileSync写入的内容哦");

/**
 * appendFile 异步追加写入文件
 * @param {string} path - 文件路径
 * @param {string | Buffer} data - 写入的内容
 * @param {(Error | null) => void} callback - 回调函数,写入完成后调用
 * @returns {void}
 */
fs.appendFile("./demo.js", '\r\nconsole.log("appendFile追加的console");', err => {
  // 追加写入失败 err为一个错误对象
  if (err) return console.log("appendFile追加写入失败", err);
  // 追加写入成功 err为null
  console.log("appendFile写入成功", err);
});

/**
 * appendFileSync 同步追加写入文件
 * @param {string} path - 文件路径
 * @param {string | Buffer} data - 写入的内容
 * @returns {void}
 */
fs.appendFileSync("./demo.js", '\r\nconsole.log("appendFileSync追加的console");');

// 文件流式写入 逐步写,但是生成的时候会生成第一个,后续放依赖进行缓存,直到缓存区写完,第一次写入是真的向文件中写,后续的操作都缓存到链表中
const ws = fs.createWriteStream("./stream.js"); // 创建写入流对象和通道
let index = 0;
let timer = setInterval(() => {
  index++;
  if (index > 10) {
    clearInterval(timer);
    timer = null;
    ws.end(); // ws.close() 自己查区别 // 关闭通道 可选 默认会关闭
    return;
  }
  ws.write(`\r\nconsole.log("${index} 我是流式写入的文件");`); // 写入
}, 100);

2、读取文件

const fs = require("fs");
/**
 * readFile 异步一次性读取文件
 * @param {string} path - 文件路径
 * @param {((Error | null) , data) => void} callback - 回调函数,写入完成后调用
 * @returns {void}
 */
// 第二个参数为options(对象或字符串),可选项,如果没有则走回调
fs.readFile("./demo.js", (err, data) => {
  // 读取失败 err为一个错误对象
  if (err) return console.log("readFile读取失败", err);
  // 读取成功 err为null
  console.log("readFile写入成功", data.toString());
});

/**
 * readFileSync 同步一次性读取文件
 * @param {string} path - 文件路径
 * @returns 读取的文件
 */
const panghuData = fs.readFileSync("./demo.js");

// 文件流式读取
const rs = fs.createReadStream("./demo.js"); // 创建读取流对象和通道
// 绑定data事件
rs.on("data", chunks => {
  console.log("🚀 ~ chunks:", chunks.toString()); // toString注意文件类型
});
// 绑定end事件
rs.on("end", () => {
  console.log("读取完成");
});

3、文件重命名与移动

const fs = require("fs");
/**
 * rename 异步重命名或移动文件
 * @param {string} path - 文件原路径
 * @param {string} path - 文件新路径 就可以重命名
 * @param {(Error | null) => void} callback - 回调函数,完成后调用
 * @returns {void}
 */
fs.rename("./demo.js", "./demo_copy.js", err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});

// renameSync 同步
fs.renameSync("./demo1.js", "./demo1_copy.js");

4、文件删除

const fs = require("fs");
/**
 * unlink 删除文件
 * @param {string} path - 文件路径
 * @param {(Error | null) => void} callback - 回调函数,完成后调用
 * @returns {void}
 */
fs.unlink("./demo_copy.js", err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});

// 同步 unlinkSync
fs.unlinkSync("./demo_copy.js");

// rm方法 14.4版本增加
/**
 * rm 删除文件
 * @param {string} path - 文件路径
 * @param {(Error | null) => void} callback - 回调函数,完成后调用
 * @returns {void}
 */
fs.rm("./demo_copy.js", err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});

// 同步 rmSync
fs.rmSync("./demo_copy.js");

5、文件夹操作

const fs = require("fs");
/**
 * mkdir 异步创建文件夹
 * @param {string} path - 文件路径
 * @param {(Error | null) => void} callback - 回调函数,完成后调用
 * @returns {void}
 */
fs.mkdir("./node_测试文件夹", err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});
// 递归创建 直接创建会失败 必须增加第二个配置项 recursive为true
fs.mkdir("./node_测试文件夹/a/b", { recursive: true }, err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});

// mkdirSync 同步创建文件夹
fs.mkdirSync("./node_测试文件夹");

// readdir 异步读取文件夹
fs.readdir("./", (err, data) => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", data);
});
// readdirSync 同步读取文件夹
fs.readdirSync('./')

// rm 异步删除文件夹
fs.rmdir("./node_测试文件夹/a/b", err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});

// rmdirSync 同步删除文件夹
fs.rmdirSync('./')

// 递归删除文件夹 (不推荐)
fs.rmdir("./node_测试文件夹", { recursive: true }, err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});

// 递归删除文件夹 (推荐)
fs.rm("./node_测试文件夹", { recursive: true }, err => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", err);
});

6、查看资源状态

const fs = require("fs");
/**
 * stat 查看资源状态
 * @param {string} path - 文件路径
 * @param {((Error | null),object) => void} callback - 回调函数,完成后调用
 * @returns {void}
 */
fs.stat("./demo.js", (err, data) => {
  // 失败 err为一个错误对象
  if (err) return console.log("失败", err);
  // 成功 err为null
  console.log("成功", data);
  // isFile 检查资源是否是文件
  console.log(data.isFile());
  // isDirectory 检查资源是否是文件夹
  console.log(data.isDirectory());
});

// 同步 statSync
fs.statSync("./demo.js");