node.js--fs文件系统模块:查看文件状态、读取文件、写入文件、追加写入、分批读取、分批写入、拷贝文件、pipe拷贝文件

fs模块是Nodejs官方提供的、用来操作文件的模块。它提供了一些列的方法和属性,用来满足用户对文件的操作需求

1.查看文件状态

fs.stat(path[, options], callback)  异步方法 :

let fs = require("fs");

console.log("1");

//获取当前文件的路径
// console.log(__filename);

//获取当前文件所属的文件夹
// console.log(__dirname);

fs.stat(__filename, function(err, stats) {
    // console.log("3");
    // console.log(err);
    // birthtime: 文件的创建时间
    // mtime: 文件中内容发生变化, 文件的修改时间
    console.log(stats);

    if (stats.isFile()) {
        console.log("当前路径对应的是一个文件");
    } else if (stats.isDirectory()) {
        console.log("当前路径对应的是一个文件夹");
    }
});
console.log("2");

fs.statSync(path[, options])  同步方法:

let fs = require("fs");

console.log("1");

//获取当前文件所属的路径
// console.log(__filename);

// 获取当前文件所属路径的文件夹
// console.log(__dirname);


console.log("2");


let stats = fs.statSync(__filename);
console.log(stats);


2.读取文件

fs.readFile(path[, options], callback)  异步方法

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

// 1.拿到需要读取的文件路径
let str = path.join(__dirname, "data.txt");
console.log(str);

// 2.读取文件
// fs.readFile(path[, options], callback)
fs.readFile(str, "utf8", function(err, data) {
    if (err) {
        throw new Error("读取文件失败");
    }
    console.log(data);
    console.log(data.toString());
});

fs.readFileSync(path[, options])   同步方法

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

// 1.拿到需要读取的文件路径
let str = path.join(__dirname, "data.txt");
console.log(str);

// 2.读取文件
// fs.readFileSync(path[, options])

let data = fs.readFileSync(str, "utf8");
console.log(data);

注意点:

  • 没有指定第二个参数, 默认会将读取到的数据放到Buffer中
  • 第二个参数指定为utf8, 返回的数据就是字符串


3.文件写入

fs.writeFile(file, data[, options], callback)  异步方法:

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

// 1.拼接写入的路径
let str = path.join(__dirname, "lnj.txt");

// 2.写入数据
// fs.writeFile(file, data[, options], callback) 
/*
fs.writeFile(str, "百度 www.baidu.com", "utf-8", function (err) {
 或如下写法
*/
let buf = Buffer.from("www.baidu.com");
fs.writeFile(str, buf, "utf-8", function(err) {
    if (err) {
        throw new Error("写入数据失败");
    } else {
        console.log("写入数据成功");
    }
});

fs.writeFileSync(file, data[, options])  同步方法:

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

// 1.拼接写入的路径
let str = path.join(__dirname, "lnj.txt");

// 2.写入数据
//  fs.writeFileSync(file, data[, options])

let res = fs.writeFileSync(str, "百度 www.baidu.com", "utf-8");
console.log(res);


4.追加写入

fs.appendFile(path, data[, options], callback) 异步方法:

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

// 1.拼接写入的路径
let str = path.join(__dirname, "lnj.txt");

// 2.开始追加数据
fs.appendFile(str, " BAT", "utf8", function(err) {
    if (err) {
        throw new Error("追加数据失败");
    } else {
        console.log("追加数据成功");
    }
});

fs.appendFileSync(path, data[, options]) 同步方法:

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

// 1.拼接写入的路径
let str = path.join(__dirname, "lnj.txt");

// 2.开始追加数据
fs.appendFileSync(str, " AAA", "utf8");


5.分批读取和分批写入

  • 前面讲解的关于文件写入和读取操作都是一次性将数据读入内存或者一次性写入到文件中
  • 但是如果数据比较大, 直接将所有数据都读到内存中会导致计算机内存爆炸,卡顿,死机等
  • 所以对于比较大的文件我们需要分批读取和写入

fs.createReadStream(path[, options])--分批读取:

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


// 1.拼接读取的路径
let str = path.join(__dirname, "lnj.txt");

// 2.创建一个读取流
// createReadStream(path[, options])
// highWaterMark  每次读取多少个字节
let readStream = fs.createReadStream(str, { encoding: "utf8", highWaterMark: 1 });

// 3.添加事件监听
readStream.on("open", function() {
    console.log("表示数据流和文件建立关系成功");
});
readStream.on("error", function() {
    console.log("表示数据流和文件建立关系失败");
});
readStream.on("data", function(data) {
    console.log("表示通过读取流从文件中读取到了数据", data);
});
readStream.on("close", function() {
    console.log("表示数据流断开了和文件的关系, 并且数据已经读取完毕了");
});

fs.createWriteStream(path[, options])--分批写入:

// 1.拼接写入的路径
let str = path.join(__dirname, "it.txt");

// 2.创建一个写入流 createWriteStream(path[, options])
let writeStream = fs.createWriteStream(str, { encoding: "utf8" });

// 3.监听写入流的事件
writeStream.on("open", function() {
    console.log("表示数据流和文件建立关系成功");
});
writeStream.on("error", function() {
    console.log("表示数据流和文件建立关系失败");
});
writeStream.on("close", function() {
    console.log("表示数据流断开了和文件的关系");
});

//需要写入的数据 
let data = "www.baidu.com";

let index = 0;

let timerId = setInterval(function() {
    //每隔一秒就取出一个
    let ch = data[index];
    index++;

    //写入数据
    writeStream.write(ch);

    console.log("本次写入了", ch);

    //判断是否写完
    if (index === data.length) {
        clearInterval(timerId);
        //写入结束
        writeStream.end();
    }
}, 1000);


6.拷贝文件

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

// 1.生成读取和写入的路径
let readPath = path.join(__dirname, "test.mp4");
let writePath = path.join(__dirname, "abc.mp4");

// 2.创建一个读取流
let readStream = fs.createReadStream(readPath);

// 3.创建一个写入流
let writeStream = fs.createWriteStream(writePath);

// 4.监听读取流事件
readStream.on("open", function() {
    console.log("表示数据流和文件建立关系成功");
});
readStream.on("error", function() {
    console.log("表示数据流和文件建立关系失败");
});
readStream.on("data", function(data) {
    // console.log("表示通过读取流从文件中读取到了数据", data);
    writeStream.write(data);
});
readStream.on("close", function() {
    console.log("表示数据流断开了和文件的关系, 并且数据已经读取完毕了");
    writeStream.end();
});

// 5.监听写入流的事件
writeStream.on("open", function() {
    console.log("表示数据流和文件建立关系成功");
});
writeStream.on("error", function() {
    console.log("表示数据流和文件建立关系失败");
});
writeStream.on("close", function() {
    console.log("表示数据流断开了和文件的关系");
});


7. pipe拷贝文件

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

// 1.生成读取和写入的路径
let readPath = path.join(__dirname, "test.mp4");
let writePath = path.join(__dirname, "abc.mp4");

// 2.创建一个读取流
let readStream = fs.createReadStream(readPath);

// 3.创建一个写入流
let writeStream = fs.createWriteStream(writePath);

// 利用读取流的管道方法来快速的实现文件拷贝
readStream.pipe(writeStream);


版权声明:本文为weixin_43285360原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。