资讯专栏INFORMATION COLUMN

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

MrZONT / 828人阅读

创建和删除目录

异步创建删除目录

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请求是输入流,响应是输出流.
流的应用:

处理数据,最典型的就是http服务的时候.请求和响应就是流的一种体现,再比如对数据进行的处理,例如webpack,gulp也大量运用了流这个技术,或者对文件进行打包压缩

提高读写性能,与文件系统的读写命令有所区别,文件系统的读写文件命令是一次性把文件里的内容放到内存当中,如果文件很大,用这种命令就不太合适,要用流来处理,流会把内容放到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");
    });

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102484.html

相关文章

  • [译]关于Node.js streams你需要知道的一切

    摘要:当一个客户端的响应对象是一个可读流,那么在服务器端这就是一个可写流。的模块给我们提供了一个可以操作任何文件的可读流通过方法创建。创建一个可读流创建可读流,我们需要类创建一个可读流非常简单。可以通过修改可读流配置里面的方法实现。 Node.js的stream模块是有名的应用困难,更别说理解了。那现在可以告诉你,这些都不是问题了。 多年来,开发人员在那里创建了大量的软件包,其唯一目的就是使...

    bang590 评论0 收藏0
  • Java IO

    摘要:分类一按操作方式类结构字节流和字符流字节流以字节为单位,每次次读入或读出是位数据。该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区字符数组,通过内部的指针来操作字符数组中的数据。 分类一:按操作方式(类结构) 字节流和字符流: 字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据。 字符流:以字符为单位,每次次读入或读出是16位数据。其只能读取字符类...

    Salamander 评论0 收藏0
  • 第十五章 输入输出系统

    摘要:在包下主要包括输入输出两种流,每种输入输出流又可分为字节流和字符流两大类。输入输出是从程序运行所在的内存的角度而言的。的输入流主要由和作为基类,而输出流主要由和作为基类。 本章主要参考和摘自疯狂java讲义上面的(java编程思想的后面看过后有新的内容再补充进去吧)。  输入输出是所有程序都必需的部分————使用输入机制允许程序读取外部数据(包括磁盘、光盘等存储设备上的数据和用户输入的...

    hankkin 评论0 收藏0
  • gulp详细基础教程

    摘要:核心概念流流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。类型,设置输出路径以某个路径的某个组成部分为基础向后拼接。 一、gulp简介 1.gulp是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用它,不仅可以很愉快的编写代码,而且大大提高我们的工...

    xuhong 评论0 收藏0
  • gulp详细基础教程

    摘要:核心概念流流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。类型,设置输出路径以某个路径的某个组成部分为基础向后拼接。 一、gulp简介 1.gulp是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用它,不仅可以很愉快的编写代码,而且大大提高我们的工...

    vibiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<