zoukankan      html  css  js  c++  java
  • 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);
    });
  • 相关阅读:
    关于document.body.scrollTop用法
    set回顾
    用户登录与注册
    编写通讯录2
    利用字典的特性编写一个通讯录
    shelve模块
    shutil模块
    列表的拓展
    随机生成验证码2
    递归与欧几里得算法结合求最大公约数
  • 原文地址:https://www.cnblogs.com/lguow/p/13542350.html
Copyright © 2011-2022 走看看