node 操作文件流 fs 同步与异步 流式文件的写入与读取

fs

fs ( File System ) 文件系统

在node中通过fs模块来和系统中的文件进行交互
通过fs模块可以对磁盘中的文件做各种增删改查的操作

    写入文件
        1.同步写入
        2.异步写入
        3.简单写入
        4.流式写入

    读取文件

        在fs模块中所有的方法都有两个版本
            不带sync的,异步方法
            带sync的,同步方法

1、同步写入

**1.打开要写入的文件**
    fs.openSync(path, flags[, mode])
    该方法用来打开一个文件
    参数:
    path:路径,要打开文件的路径
    flags:操作的类型,要对文件做什么操作
    需要字符串作为参数
    "w""r""a" 追加
    mode:可选参数,一般不传,用来设置文件的权限

    返回值:
    fd 文件的描述符

2.写入并保存
    fs.writeSync(fd, string[, position[, encoding]])
    该方法用于向文件中写入内容
    参数:
    fd: 文件的描述符,需要指定要写入文件的描述符
    string: 要写入的内容
    position: 开始写入的位置
    encoding: 写入内容的字符编码,默认utf-8


3.关闭文件
    fs.closeSync(fd):: 该方法用来关闭文件
    参数:
    fd 文件的描述符

实例
    //引入fs模块
    var fs=require('fs');
    var fd=fs.openSync('gzl.txt','w');
    fs.writeSync(fd,'1111',10,'utf-8');
    fs.closeSync(fd);

2.简单文件的写入

简单文件写入
     fs.writeFile(file, data[, options], callback)
     fs.writeFileSync(file, data[, options])
 - 参数:
        file 要写入的文件的路径
        data 要写入的内容
        options 配置对象(可选)
            encoding 编码 默认 utf8
            flag  操作类型  默认 w
            mode  文件的权限 默认666,一般不需要传
            callback 回调函数,写入完成后会调用该函数

3.异步写入

1.打开文件
    fs.open(path, flags[, mode], callback)
    参数:callback
    回调函数,会在文件打开以后执行
    回调函数中会有两个参数:
    err: 错误信息,如果操作过程中出现了错误,则该对象存在,如果没有出现错误,则该参数的值为null
    错误优先
    fd: 文件的描述符

2.写入文件
    fs.write(fd, string[, position[, encoding]], callback)
    callback 回调函数会在写入完毕以后执行
    参数:
    err 错误对象
    byte 写入的字节数
    data 写入的数据

3.关闭文件
    fs.close(fd, callback)


异步写入的相关代码:::
var fs=require('fs');
fs.open('gzl.txt','a',function (err,fd) {
    if (!err){
        fs.write(fd,'ffffff',10,function (err,bite,data) {
          if (!err){
              console.log('文件写入成功');
          };
          fs.close(fd,function (err) {
            if (!err){
                console.log('文件已关闭');
            };
          });
        });
    };
});

4.流式文件的写入与读取

流式文件写入
   其他的文件的写入方式都是一次性将一个内容写入到文件中的,
   如果文件太大了则会导致运行速度过慢,会严重影响程序的性能
   流式文件写入适合较大的文件写入,可以分多次将多个内容输出到文件中
相关代码:
//创建一个可写流(WriteStream)
var ws = fs.createWriteStream("hello3.txt");

//为流绑定一个open和close事件,来监听流是否打开和关闭
ws.once("open",function () {
    console.log("流打开了~~~");
});

ws.once("close",function () {
    console.log("流关闭了~~~");
});

//通过可写流向文件中输出内容
ws.write("O(∩_∩)O哈哈~");
ws.write("O(∩_∩)O~");

//关闭流
ws.end();

流式文件读取 适合较大的文件读取

相关代码:
//创建一个可读流
var rs = fs.createReadStream("C:\Users\lilichao\Desktop\笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("a.mp3");

//监听流的状态
rs.once("open",function () {
    console.log("可读流已经打开");
});

rs.once("close",function () {
    console.log("可读流已经关闭");
    //关闭可写流
    ws.end();
});

ws.once("open",function () {
    console.log("~~~~可写流已经打开");
});

ws.once("close",function () {
    console.log("~~~~可写流已经关闭");
});

//要读取一个可读流中的数据,必须要给该流绑定一个data事件
//绑定data事件后,流会自动读取数据,数据读取完毕以后,流会自动关闭
//读取到的数据会通过回调函数的参数的形式返回
rs.on("data",function (data) {
    //console.log(data.length);
    //将数据线写入到可写流中
    ws.write(data);

});


简单方法::
//创建一个可读流
var rs = fs.createReadStream("C:\Users\lilichao\Desktop\笔记.mp3");
//创建一个可写流
var ws = fs.createWriteStream("b.mp3");
//将可读流中的数据写入到可写流中
rs.pipe(ws);

5.其他读取文件

相关代码:
/*
 验证路径是否存在
     fs.existsSync(path)
 获取文件信息
     fs.stat(path, callback)
     fs.statSync(path)
 删除文件
     fs.unlink(path, callback)
     fs.unlinkSync(path)

 */

var result = fs.existsSync("ab.jpg");

//console.log(result);


fs.stat("a.jpg", function (err , stats) {
    if(!err){
        //stats 是一个对象,在该对象中保存了当前文件的状态信息
        /*
            通过该对象可以获取文件的状态
                stats.size 获取文件的大小
                stats.isFile() 是否是文件
                stats.isDirectory()是否是目录
         */
        //console.log(stats.isDirectory());
    }
});

//删除文件
//fs.unlinkSync("hello.txt");

/*
 列出文件
     fs.readdir(path[, options], callback)
     fs.readdirSync(path[, options])
 截断文件
     fs.truncate(path, len, callback)
     fs.truncateSync(path, len)
 建立目录
     fs.mkdir(path[, mode], callback)
     fs.mkdirSync(path[, mode])

 */

/*
fs.readdir(".",function (err , files) {
    if(!err){
        //files是一个保存了目录下文件(夹)名字的string数组
        console.log(files[0]);
    }
});*/

//截断文件 将文件截断成指定的大小,会丢失数据
//fs.truncateSync("hello2.txt",10);

//创建目录
//fs.mkdir("hello");

/*
删除目录
 fs.rmdir(path, callback)
 fs.rmdirSync(path)
重命名文件和目录
 fs.rename(oldPath, newPath, callback)
 fs.renameSync(oldPath, newPath)
 - 通过该方法也可以实现剪切的功能

监视文件更改写入
    fs.watchFile(filename[, options], listener)
        - 参数:
    filename 文件名
    options 配置对象
    listener 回调函数,当前文件发生变化时,该函数将会执行
        - curr 表示文件现在的状态
        - prev 表示文件修改前的状态
            - 这两个对象都是stats对象

*/

//fs.rmdir("hello");

/*fs.rename("b.mp3","C:\Users\lilichao\Desktop\b.mp3",function (err) {
    if(!err){
        console.log("修改成功");
    }
});*/

fs.watchFile("hello2.txt",{interval:1000},function (curr,prev) {
    console.log("当前文件的大小为: "+curr.size);
    console.log("修改前文件的大小为: "+prev.size);
});
原文地址:https://www.cnblogs.com/lguow/p/13542350.html