zoukankan      html  css  js  c++  java
  • nodejs模块之fs&&stream

    nodejs的文件系统fs模块,可以实现对文件、目录等的操作,stream模块实现对文件数据的断续读写操作

    一、文件操作

    fs.readFile(file[,options],callback)  异步读取数据,参数err,data

    fs.readFileSync(file[,options])  同步读取数据,返回读取的数据

    fs.writeFile(file, data[,options],callback)  异步写数据,参数err

    fs.writeFileSync(file,data[,options])  同步写数据,返回undefined

    fs.stat(path,callback)  返回一个stats对象到回调函数参数中, 通过该stats对象获取文件信息,参数err,stats

    fs.statSync(path)  同步,返回一个stats对象

    ------------------------------------------------------------------

    stats对象获取信息方法:

    stats.isFile()   是否为文件
    stats.isDirectory()   是否为目录(文件夹)
    stats.isBlockDevice()
    stats.isCharacterDevice()
    stats.isSymbolicLink() (only valid with fs.lstat())
    stats.isFIFO()
    stats.isSocket()

    -------------------------------------------------------------

    在index.js同级目录下创建一个file.txt, 里面填写数据作为测试用,比如Hello World

    1、fs.readFile

    "use srict";
    
    const fs = require('fs');
    
    fs.readFile('./file.txt', 'utf-8', function (err, data) {
        if (err) {
            console.log(err);
            return;
        }
        console.log(data);
    });

    2、fs.readFileSync

    "use srict";
    
    const fs = require('fs');
    
    const data = fs.readFileSync('./file.txt', 'utf-8');
    console.log(data);

    3、fs.writeFile

    读取file.txt文件数据,然后写到data.txt文件中,如果data.txt不存在,会自动创建然后写入,如果存在会先删除data.txt中数据,然后写入覆盖。

    "use srict";
    
    const fs = require('fs');
    
    fs.readFile('./file.txt', 'utf-8', function (err, data) {
        if (err) {
            console.log(err);
            return;
        }
        fs.writeFile('./data.txt', data + ' from file.txt', 'utf-8', function (err) {
            if (err) {
                console.log(err);
                return;
            }
            console.log('write success');
        })
    });

    4、fs.stat

    "use srict";
    
    const fs = require('fs');
    
    fs.stat('./file.txt', (err, stats) => {
        if (err) {
            console.log(err);
            return;
        }else {
            if (stats.isFile()) {
                fs.readFile(fileName, 'utf-8', (err, data) => {
                    if (err) {
                        console.log(err);
                        return;
                    }
                    fs.writeFile('./swFile.txt', data + 'from file.txt by stat', 'utf-8', (err) => {
                        if (err) {  
                            console.log(err);
                            return;
                        }
                        console.log('write success stat');
                    })
                });
            } else {
                console.log('The file is dirtory');
            }
        }
    });

    二、文件夹操作

    fs.mkdir(path[,mode],callback)  创建文件夹,参数mode指的是文件夹权限,参数err

    fs.mkdirSync(path[,mode])  同步创建文件夹,返回undefined

    fs.readdir(path[,options],callback)  读取文件夹,返回一个数组到回调参数,包含该文件夹所有子内容的名字string,不包括子孙内容,参数err, dir

    fs.readdirSync(path[,options])  同步读取文件夹,返回读取的文件夹数组数据

    "use srict";
    
    const fs = require('fs');
    
    fs.readdir('./fsDemo', function (err, dir) {
        if (err) {
            console.log(err);
            return;
        }
        console.log(dir); // ['demo01', 'demo02']
    });

    遍历文件夹中所有子孙,然后打印出其名字:

    "use strict";
    // 遍历目录中所有文件
    const fs = require('fs');
    
    bfs('./dir');
    
    function bfs(dirPath) {
        const state = fs.statSync(dirPath);
        if (state.isFile()) {
            console.log(dirPath);
            return;
        }
        if (!state.isDirectory()) {
            return;
        }
        fs.readdir(dirPath, function (err, dirs) {
            if (err) {
                console.log(err);
                return;
            }
            dirs.forEach((dir, index, arr) => {
                bfs(dirPath + '/' + dir); 
            });
        });
    }

    四、流操作(stream模块)

    fs.createReadStream(path[,options])  创建一个读流操作对象,返回一个readable对象

    -------------------------------------------------------

    readable对象支持的事件:

    data:当有数据读取的时候,返回读取的数据到回调函数参数中

    readable:当有数据可读取的时候触发,但不会读取数据,仅仅做判断用

    end:当数据全部读取完毕的时候触发

    readable对象支持的方法:

    rs.pause()  暂停读取数据

    rs.resume()  打开读取流,恢复读取数据

    rs.read()  读取当前剩余数据并返回,没有则返回null

    options 是一个对象或者字符串,各个默认值为

    {
      flags: 'r',
      encoding: null,
      fd: null,
      mode: 0o666,
      autoClose: true
    }

    ---------------------------------------------------

    fs.createWriteStream(path[,options])  写流操作,返回一个writable对象

    ---------------------------------------------------

    writable支持的事件:

    finish:当end方法被调用,且所有数据都写入完毕时触发

    pipe:当对象通过pipe写入数据时

    writable对象支持的方法:

    ws.write(chunk[,encoding][,callback])  写数据,chunk是要写入的数据(string|buffer) callback:写入后回调函数

    ws.end()  关闭写入流

    ----------------------------------------------------

    pipe方法:

    rs.pipe(ws) 从左向右看,创建一个管道,将rs读取的数据通过管道流入到ws写入

    -----------------------------------------------------------------------------------------------------------

    fs.createReadStream

    "use srict";
    
    const fs = require('fs');
    
    const rs = fs.createReadStream('./file.txt', 'utf-8');
    // 当读取数据时触发,将读取的数据打印
    rs.on('data', function (data) {
        console.log(data);
    });
    // 当有数据可读是,将剩余数据全部打印出来
    rs.on('readable', function() {
        console.log(rs.read())
    });
    // 当读取结束时,打印read finished
    rs.on('end', function () {
        console.log('read finished');
    });

    fs.createWriteStream

    "use strict";
    
    const fs = require('fs');
    
    const rs = fs.createReadStream('./file.txt', 'utf-8'); 
    const ws = fs.createWriteStream('./data.txt', {
        flags: 'w', // a 追加,w 删除后再写,默认为w
        
    });
    // 当读取数据时触发,将读取的数据写入
    rs.on('data', function (data) {
        ws.write(data);
    });
    // 当读取数据结束时,关闭写入流,打印write end
    rs.on('end', function (data) {
        ws.end();
        console.log('write end');
    });
    
    // 其实可以通过pipe方法,一句代码实现上边的功能,如下
    // rs.pipe(ws);

     五、文件检测:

    fs.watch(filename[,options][,listener])  监听文件是否改变

    ------------------------------------------------------------------------------------------

    options = {
    persistent: 是否持续的检测文件,默认为true,
    recursive: 如果检测的是一个目录,是否检测整个目录,默认为false,
    encoding: 编码,默认utf-8
    }

    listener监听函数有两个参数, eventType和filename,
    eventType是事件类型'rename' / 'change',
    filename是监听的文件名字

    rename发生后,无法继续检测

    --------------------------------------------------------------------------------------------

    使用postcss和autoprefixer这两个插件来检测css文件,如果我们更改了该css内容,则自动读取该css文件内容,然后经过这两个插件处理为响应属性自动添加前缀,然后写入到dest.css 目标文件中,省去了我们增加前缀的时间。

    首先我们建立postcss文件,然后建立一个index.css文件和index.js文件,最后在该目录下执行npm init创建一个包,然后执行npm install postcss autoprefixer --save安装这两个插件。

    我们在index.js文件中添加如下代码:

    "use strict";
    // npm init
    // cnpm install postcss autoprefixer --save
    const postcss = require('postcss');
    const fs = require('fs');
    const source = "./index.css";
    const dest = './dest.css';
    // 检测文件是否发生改变,如果发生改变,则读取文件,然后处理,最后写到dest.css目标文件上
    fs.watch(source, function () {
        fs.readFile(source, 'utf-8', function (err, css) {
            postcss([require('autoprefixer')])
                .process(css)
                .then(function (result) {
                    // result.css
                    fs.writeFile(dest, result.css);
                    console.log('compile success');
                });
        }); 
    });
    
    console.log('start watch……');

    执行node index.js,

    然后在index.css代码中添加

    div
    {
        transition: width 2s;
        transition-property: width;
        transition-duration: 1s;
        transition-timing-function: linear;
        transition-delay: 2s;
    }   

    最后我们可以看到,该目录下生成了一个dest.css文件,其中就是自动为index.css代码添加前缀后的代码,如下:

    div
    {
        -webkit-transition: width 2s;
        transition: width 2s;
        -webkit-transition-property: width;
        transition-property: width;
        -webkit-transition-duration: 1s;
                transition-duration: 1s;
        -webkit-transition-timing-function: linear;
                transition-timing-function: linear;
        -webkit-transition-delay: 2s;
                transition-delay: 2s;
    }   

    -------------------------------------------------------------------------------------end

  • 相关阅读:
    C *p++ (*p)++ *p+=2 区别
    C 找到两字串中最长的相同串
    Jquery插件Jquerycolor
    C Fibonacci前N项和 阶乘的前N项和
    Baidu Google地图应用
    6.11Java多线程、并发、同步、synchronized方法
    6.10Java线程同步_synchronized
    6.18Java多线程并发、同步性能分析
    6.11Java多线程、并发、同步、synchronized块
    6.18Java多线程同步方法实现DemoNo2
  • 原文地址:https://www.cnblogs.com/Walker-lyl/p/7249625.html
Copyright © 2011-2022 走看看