node —— fs文件系统

108 阅读3分钟

注意:本文node版本是v12.18.1,不同版本请查看官方中文文档 或者英文文档

1. 读取文件

1.1 fs.readFile()

异步读取

const fs = require('fs');
fs.readFile('./hello.txt', (err, data) => {
    if(err) {
        console.log('出错了', err);
    }else {
        console.log(data, data.toString());
    }
});
// <Buffer 68 65 6c 6c 6f 32> hello2
// 注意: data获得的文件内容是Buffer数据,想获得源字符串内容需要toString()方法。

1.2 fs.readFileSync()

同步读取

// 方式1
const data = fs.readFileSync('./hello.txt');
// 方式2
const data = fs.readFileSync('./hello.txt',{flag:'r',encoding:"utf-8"})
console.log(data, data.toString());
// <Buffer 68 65 6c 6c 6f 32> hello2

1.3 封装

const fs = require("fs");

function fsRead (path) {
    return new Promise(function (resolve, reject) {
        fs.readFile(path,{flag: 'r',encoding:"utf-8"},function(err,data){
            if(err){
                // console.log(err);
                // 失败执行的内容
                reject(err);
            }else{
                // console.log(data);
                // 成功执行的内容
                resolve(data);
            }
        });
    })
}

2. 写入文件

2.1 fs.writeFile()

异步写入

2.1.1 基本使用

const fs = require("fs");
const data = "测试一下写入功能1";
fs.writeFile("./test1.txt", data, (err) => {
  if (err) {
    console.log("出错了", err);
  } else {
    console.log("写入成功", data);
  }
});

2.1.2 参数的使用

// flag: 'w', write后面写入的会把前面的覆盖,flag: 'a',append不会覆盖,会在后面写入
fs.writeFile("./test.txt", data, { encoding: "utf8", flag: "a" }, (err) => {
  if (err) {
    console.log("出错了", err);
  } else {
    console.log("写入成功", data);
  }
});
// 如果文件不存在则创建文件并写入

2.1.3 封装

const fs = require("fs");
function fsWrite(path,content){
    return new Promise (function (resolve,reject) {
        fs.writeFile(path,content,{flag: 'a',encoding: 'utf-8'},function (err) {
            if(err){
                // console.log("失败");
                reject(err);
            }else{
                // console.log("成功");
                resolve(err);
            }
        });
    });
}

3. 读取目录

3.1 fs.readdir()

获取目录下的文件

const fs = require("fs");
fs.readdir('../03.fs', (err, files) => {
    if(err) {
        console.log(err)
    }else {
        //  files是目录中文件名的数组
        console.log(files);
    }
})
// ['index.js', 'index1.js']

3.2 fs.rmdir

删除目录

const fs = require('fs');
// 删除test目录
fs.rmdir('./test',function () {
    console.log("删除成功");
});

4. 文件流

4.1 fs.createWriteStream()

写入流

const fs = require("fs");
// 1、创建写入流
let ws = fs.createWriteStream("hello.txt",{flags:"w",encoding:"utf-8"});
// 监听文件打开事件
ws.on('open',function(){
    console.log("文件打开");
});
// 监听准备事件
ws.on('ready',function(){
    console.log("文件写入已准备状态");
})
// 监听文件关闭事件
ws.on('close',function(){
    console.log("文件写入完成,关闭");
});
// 文件流式写入
ws.write("helloworld1!",function (err) {
    if(err){
        console.log(err);
    }else{
        console.log("内容1流入完成");
    }
});
ws.write("helloworld2!",function (err) {
    if(err){
        console.log(err);
    }else{
        console.log("内容2流入完成");
    }
});
ws.write("helloworld3!",function (err) {
    if(err){
        console.log(err);
    }else{
        console.log("内容3流入完成");
    }
});
// 文件写入完成  end 要在最后的write后面写,不然会报错,所有的write执行完后写
ws.end(function(){
    console.log("文件写入关闭");
});
// 结果
文件打开
文件写入已准备状态
内容1流入完成
内容2流入完成
内容3流入完成
文件写入关闭
文件写入完成,关闭

4.2 fs.createReadStream()

读取流

const fs = require("fs");
let rs = fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"});
rs.on('open',function(){
    console.log("读取的文件已打开");
});
rs.on('close',function(){
    console.log("读取流结束");
});
rs.on('data',function(chunk){
    console.log("单批数据流入"+chunk.length);
    console.log(chunk);
});

4.3 示例:读取hello.txt中的内容,写入hello1.txt

const fs = require("fs");
// 创建读取流,语法:fs.createReadStream(路径,【可选的配置项】)
let rs = fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"});
let ws = fs.createWriteStream('hello1.txt',{flags:'w',encoding:"utf-8"});
rs.on('open',function(){
    console.log("读取的文件已打开");
});
rs.on('close',function(){
    ws.end(() => {
        console.log('end');
    });
    console.log("读取流结束");
});
// 每一批数据流入完成
rs.on('data',function(chunk){
    console.log("单批数据流入"+chunk.length);
    console.log(chunk);
    ws.write(chunk,() => {
        console.log("单批输入流入完成");
    });
});

4.4 上面示例改进版,使用管道流pipe()

const fs = require("fs");
let rs = fs.createReadStream('hello.txt',{flags:'r',encoding:"utf-8"});
let ws = fs.createWriteStream('hello2.txt',{flags:'w'});
rs.on('open',function(){
    console.log("读取的文件已打开");
});
rs.on('close',function(){
    console.log("读取流结束");
});
// 管道读写流
rs.pipe(ws);

4.5 结论

使用管道流可以简化操作,使用更方便

最后

以上就是fs模块一些方法的使用,如有错误请指正