专栏首页马涛涛的专栏Node.js基础 78:创建和删除目录、流和管道

Node.js基础 78:创建和删除目录、流和管道

创建和删除目录

异步创建删除目录

var fs = require('fs');

fs.mkdir('stuff', function() {
    fs.readFile('readMe.txt', 'utf8', function(err, data) {
        fs.writeFile('./stuff/writeMe.txt', data, function() {
            console.log('copy successfully');
        })
    })
});
// fs.unlink("writeMe.txt", function() {
//     console.log("delete writeMe.txt file");
// })删除文件

递归删除非空文件夹

function delDir(path){
    let files = [];
    if(fs.existsSync(path)){
        files = fs.readdirSync(path);
        files.forEach((file, index) => {
            let curPath = path + "/" + file;
            if(fs.statSync(curPath).isDirectory()){
                delDir(curPath); //递归删除文件夹
            } else {
                fs.unlinkSync(curPath); //删除文件
            }
        });
        fs.rmdirSync(path);
    }
}
module.exports = delDir;

流和管道

举例:在命令行中

ls命令:查看当前目录下的文件和目录 grep:筛选,例如是否包含"app"这个关键字 ls输出一个(输出一个信息),这个作为了grep命令的输入

文档:http://nodejs.cn/api/stream.h... 例如:HTTP请求是输入流,响应是输出流. 流的应用:

  1. 处理数据,最典型的就是http服务的时候.请求和响应就是流的一种体现,再比如对数据进行的处理,例如webpack,gulp也大量运用了流这个技术,或者对文件进行打包压缩
  2. 提高读写性能,与文件系统的读写命令有所区别,文件系统的读写文件命令是一次性把文件里的内容放到内存当中,如果文件很大,用这种命令就不太合适,要用流来处理,流会把内容放到buffer(缓存)中,一边放一边处理,这样的话性能就会很高
//把读取的文件放入一个流中
var fs = require('fs')
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
//流是一个事件的实例,所以可以放置监听事件(流可以是可读的、可写的、或者可读可写的。 所有的流都是 EventEmitter 的实例。)
myReadStream.on('data',function(chunk) {//chunk是块的意思
    console.log('new chunk received')
    console.log(chunk)
})

readMe.txt文件有5000行的字符,把文件分成一个个buffer,分段处理

在参数里加utf-8,会发现,把那段字符打印出来.

on是在接收数据的时候的监听函数,end代表在接受数据完成之后的数据

var fs = require('fs')
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
myReadStream.setEncoding('utf8')//编码也可以这样写
var data = ''
myReadStream.on('data',function(chunk) {
    data+=chunk
})
myReadStream.on('end',function () {
    console.log(data)
})

以上就是把一个readMe.txt当做一个流来处理.

如何写一个流

新建一个写入流. 写入的时候直接使用方法write,参数为数据片段 把readMe.txt里面的内容写到writeMe2.txt里面

var fs = require('fs')
var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
var myWriteStream = fs.createWriteStream(__dirname+'/writeMe2.txt')//新建一个写入流.
myReadStream.setEncoding('utf8')
var data = ''
myReadStream.on('data',function(chunk) {
    myWriteStream.write(chunk)//写入的时候直接使用方法write,参数为数据片段
})
myReadStream.on('end',function () {
    // console.log(data)
})

或者: 把'hello world'写入''writeMe2.txt' 文件

var myWriteStream = fs.createWriteStream(__dirname+'/writeMe2.txt')
var writeData = 'hello world'
myWriteStream.write(writeData)
myWriteStream.end()
myWriteStream.on('finish',function () {
    console.log('finish')
})

使用管道更方便得实现流的操作

实现复制内容的操作

var myReadStream = fs.createReadStream(__dirname + '/readMe.txt')
var myWriteStream = fs.createWriteStream(__dirname+'/writeMe2.txt')
myReadStream.pipe(myWriteStream)

把readMe的内容复制到writeMe2 管道运送

流与管道例子

加密,压缩的过程

// 压缩
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');

var password = new Buffer(process.env.PASS || 'password');
var encryptStream = crypto.createCipher('aes-256-cbc', password);

var gzip = zlib.createGzip();
var readStream = fs.createReadStream(__dirname + "/readMe.txt"); // current file
var writeStream = fs.createWriteStream(__dirname + '/out.gz');

readStream // reads current file
    .pipe(encryptStream) // encrypts
    .pipe(gzip) // compresses
    .pipe(writeStream) // writes to out file
    .on('finish', function() { // all done
        console.log('done');
    });



// 解压
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');

var password = new Buffer(process.env.PASS || 'password');
var decryptStream = crypto.createDecipher('aes-256-cbc', password);

var gzip = zlib.createGunzip();
var readStream = fs.createReadStream(__dirname + '/out.gz');

readStream // reads current file
    .pipe(gzip) // uncompresses
    .pipe(decryptStream) // decrypts
    .pipe(process.stdout) // writes to terminal
    .on('finish', function() { // finished
        console.log('done');
    });

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring AOP(三) Advisor类架构

    Spring AOP是Spring的两大基石之一,不了解其基础概念的同学可以查看这两篇文章AOP基本概念和修饰者模式和JDK Proxy。

    remcarpediem
  • 前端每周清单第 46 期: 2017 Node.js / GraphQL / Vue.js 盘点,前端性能优化与可用性保障

    前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎关注...

    王下邀月熊
  • ENOENT: no such file or directory, access '/usr/local/lib/node_modules/vue-cli/node_modules/get-s...

    honey缘木鱼
  • gulp+webpack工作流探索

    最近研究了下工作流,先说一下我司的情况,我司现在是pc端用php直出,h5用vuejs构建,vuejs部分就不进行描述了,因为网上的构建方法都是很成熟的了。 以...

    Ganother
  • 前端每周清单第 48 期:Slack Webpack 构建优化,CSS 命名规范与用户追踪,Vue.js 单元测试

    前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎关注...

    王下邀月熊
  • 如何优雅地添加 MGR 节点?

    MySQL Group Replication(简称MGR)是MySQL官方于2016年12月份推出的一个全新的高可用与高扩展的解决方案。MGR提供了高可用、高...

    wubx
  • 闭锁——CountDownLatch

      闭锁是一个同步工具类,主要用于等待其他线程活动结束后,再执行后续的操作。例如:在王者荣耀游戏中,需要10名玩家都准备就绪后,游戏才能开始。

    小忽悠
  • 驾校答题小程序实战全过程【连载】——4.题目采集与测试

    由于没有数据,这次需要拿一些测试数据放到数据库。 这里想到本地采集,大家可以随意用任何后端语言,Python,PHP,Golang,Java,nodejs等等,...

    大王12
  • Node.js 中流操作实践

    Stream 是 Node.js 中的基础概念,类似于 EventEmitter,专注于 IO 管道中事件驱动的数据处理方式;类比于数组或者映射,Stream ...

    王下邀月熊
  • 深入理解计算机系统(第三版)/ CSAPP 杂谈,第10章:系统级I/O

    sickworm

扫码关注云+社区

领取腾讯云代金券