Node的文件系统

文件系统(File System)

  • 文件系统简单来说就是通过Node来操作系统中的文件

  • 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端

  • Node通过fs模块来和文件系统进行交互

  • 该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。

  • 要使用fs模块,首先需要对其进行加载

    var fs = require("fs");
    
同步和异步调用
  • fs模块中所以的操作都有两种形式可供选择 同步异步
  • 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
  • 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。

在这里插入图片描述


文件的写入

同步

手动操作的步骤

  1. 打开文件

    fs.openSync(path[, flags, mode])

    • path 要打开文件的路径

    • flags 打开文件要做的操作类型

      r 只读的

      w 可写的

    • mode 设置文件的操作权限, 一般不传

    返回值:

    ​ 该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来进行各种操作。

    var fd = fs.openSync("hello.txt", "w");
    
  2. 向文件中写入内容

    fs.writeSync(fd, string[, position[, encoding]])

    • fd 文件的描述符,需要传递要写入的文件的描述符

    • string 要写入的内容

    • position 写入的起始位置

    • encoding 写入的编码,默认utf-8

      fs.writeFileSync(fd, "写入的内容");
      

      在这里插入图片描述

  3. 保存并关闭文件

    fs.closeSync(fd)

    • fd 要关闭的文件的描述符
  4. 完整代码:

    var fs = require("fs");
    
    var fd = fs.openSync("hello.txt", "w");
    console.log(fd);
    
    fs.writeFileSync(fd, "写入的内容");
    fs.closeSync(fd);
    
异步
  • 打开一个文件

fs.open(path[, flags[, mode], callback)

var fs = require("fs");
fs.open("hello2.txt", "w", function(){});

注意: 这里不能用一个变量来保存值,异步没有返回值

  • 异步调用的方法,结果都是通过回调函数的参数来返回的

  • 回调函数两个参数:

    • err 错误对象,如果没有错误则为null
    • fd 文件的描述符
  • 写入内容,关闭文件,完整代码:

    var fs = require("fs");
    
    fs.open("hello2.txt", "w", function(err, fd){
        if(!err) {
            //如果没出错,对文件进行写入操作
            fs.write(fd, "这是异步写入的内容", function(err) {
                if(!err) {
                    console.log("写入成功");
                }
    
                //关闭文件
                fs.close(fd, function(err) {
                    if(!err) {
                        console.log("文件已关闭");
                    }
                })
            })
        }else {
            console.log(err);
        }
    });
    

简单文件写入

- 异步

fs.writeFile(file, data[, options], callback)

- 同步

fs.writeFileSync(file, data[, options])

  • file 要操作文件的路径

  • data 要写入的数据

  • options 选项,可以对写入进行一些设置(对象作为参数)

  • callback 当写入完成以后执行的函数

  • flag

    ​ r 只读

    ​ w 可写

    ​ a 追加

var fs = require("fs");
fs.writeFile("hello3.txt", "这是writeFile写入的内容", function(err) {
    if(!err) {
        console.log("写入成功");
    }
});

如果不想文本从头写,往后追加内容

fs.writeFile("hello3.txt", "这是writeFile写入的内容", {flag: "a"}, function(err) {
    if(!err) {
        console.log("写入成功");
    }
});

流式文件写入

​ 同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

fs.createWriteStream(path[, options])

  • 可以用来创建一个可写流
  • path 文件路径
  • options 配置的参数
var fs = require("fs");
//创建一个可写流
var ws = fs.createWriteStream("hello3.txt");

//通过ws向文件中输出内容
ws.write("通过可写流写入的内容");
ws.write("通过可写流写入的内容");

在这里插入图片描述

可以通过监听流的open和close时间来监听流的打开和关闭
on(事件字符串,回调函数)
  • 可以为对象绑定一个事件
once(事件字符串,回调函数)
  • 可以为对象绑定一个一次性的事件,该事件将会触发一次以后自动失效
var fs = require("fs");
//创建一个可写流
var ws = fs.createWriteStream("hello3.txt");

//可以通过监听流的open和close时间来监听流的打开和关闭
ws.once("open", function() {
    console.log("流打开了");
});
ws.once("close", function() {
    console.log("流关闭了");
});

//通过ws向文件中输出内容
ws.write("通过可写流写入的内容");
ws.write("1111111");

ws.end();

文件的读取

简单文件读取

fs.readFile(path[, options], callback)

fs.readFileSync(path[, options])

  • path 要读取的文件的路径
  • options 读取的选项
  • callback 回调函数,通过回调函数将读取的内容返回(err, data)
    • err 错误对象
    • data 读取到的数据,会返回一个Buffer
var fs = require("fs");
fs.readFile("hello3.txt", function(err, data) {
    if(!err) {
        console.log(data);
    }
})
流式文件读取

fs.createReadStream(path[, options])

​ 流式文件读取也使用于一些比较大的文件,可以分多次将文件读取到内存中。

var fs = require("fs");
var rs = fs.createReadStream("hello3.txt");

//监听流的开启和关闭
rs.once("open", function() {
    console.log("可读流打开了");
});
rs.once("close", function() {
    console.log("可读流关闭了");
});

//如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
rs.on("data", function(data) {
    console.log(data);
});

在这里插入图片描述


pipe() 可以将可读流中的内容,直接输出到可写流中
var fs = require("fs");
var rs = fs.createReadStream("hello3.txt");
var ws = fs.createWriteStream("hello4.txt");

//监听流的开启和关闭
rs.once("open", function() {
    console.log("可读流打开了");
});
rs.once("close", function() {
    console.log("可读流关闭了");
});
ws.once("open", function() {
    console.log("可写流打开了");
});
ws.once("close", function() {
    console.log("可写流关闭了");
});

rs.pipe(ws);

fs中常用的方法

  • 验证路径是否存在

    fs.existsSync(path);

var fs = require("fs");
var isExists = fs.existsSync("hello3.txt");
console.log(isExists);
  • 获取文件的状态

    fs.stat(path, callback)

    fs.statSync(path)

    它会给我们返回一个对象,这个对象中保存了当前对象状态的相关信息。

fs.stat("hello3.txt", function(err, stat) {
    console.log(stat.isFile());
})
  • 删除文件

    fs.unlink(path, callback)

    fs.unlinkSync(path)

  • 读取一个目录的目录结构

    fs.readdir(path[, options], callback)

    fs.readdirSync(path[, options])

fs.readdir(".", function(err, files) {
    if(!err) {
        console.log(files);
    }
})
  • 截断文件

    fs.truncate(path[, len], callback)

    fs.truncateSync(path[, len])

    将文件修改成为指定的大小。

  • 创建目录

    fs.mkdir(path[, options], callback)

    fs.mkdirSync(path[, options])

  • 删除目录

    fs.rmdir(path[, options], callback)

    fs.rmdirSync(path[, options])

  • 重命名文件夹

    fs.rename(oldPath, newPath, callback)

    fs.renameSync(oldPath, newPath)

fs.rename("hello2.txt", "hello5.txt", function(err) {
    if(!err) {
        console.log("修改成功");
    }
})

fs.rmdirSync(path[, options])

fs.rename("hello2.txt", "hello5.txt", function(err) {
    if(!err) {
        console.log("修改成功");
    }
})

更多详见:http://nodejs.cn/api/fs.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值