文件 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);
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: 文件创建时间戳;
}
目录信息
size:0; 目录在操作系统中实际上是一个非常小的文件,里面记录了一些指针,指向其他文件的位置。
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 判断目录是否存在,不存在就创建目录