[Nodejs]在nodejs環境下使用zip壓縮及解壓縮

作業系統:windows 7 64bits
環境:nodejs v4.2.3
主要模組:node-zip、jszip
輔助模組:fs、path、async


var _zip = require('node-zip');
var fs = require("fs");
var path = require("path");
var async = require("async");

zip("monitor");

function zip(folder_path) {
    var zip = new _zip();
    append_cur_file(folder_path);
    fs.writeFileSync(path.join(__dirname, folder_path + ".zip"), zip.generate({
        base64: false,
        compression: 'DEFLATE'
    }), 'binary');

    function append_cur_file(_path) {
        var cur_path = path.join(_path);
        var __list = fs.readdirSync(cur_path);
        console.log(__list);

        // add root folder
        zip.folder(cur_path);

        for (var i = 0; i < __list.length; i++) {
            var __fs_stat = fs.statSync(path.join(cur_path, __list[i]));
            if (__fs_stat.isDirectory() == true) {
                append_cur_file(path.join(cur_path, __list[i]));
            } else {
                zip.file(path.join(cur_path, __list[i]), fs.readFileSync(path.join(cur_path, __list[i])));
            }
        };
    }
}

upzip(__dirname + "/monitor.zip");

function unzip(zip_path) {
    var zip = new _zip(fs.readFileSync(zip_path), {
        base64: false,
        checkCRC32: true
    });

    var __list = [];
    for (var key in zip.files)
        __list.push(key);

    async.eachLimit(__list, 1,
        function(file_name) {
            if (zip.files[file_name].dir == true) {
                var fobj = path.parse(file_name);
                var _dir_list = fobj.dir.split(path.sep).filter(function(attr) {
                    return attr == undefined ? false : attr != "";
                });

                var cur_path = __dirname;
                console.log("current file:" + file_name);
                console.log("current obj:");
                console.log(fobj);

                for (var i = 0; i < _dir_list.length; i++) {
                    cur_path = path.join(cur_path, _dir_list[i]);
                    console.log("current path:" + cur_path);

                    if (fs.existsSync(cur_path) == false) {
                        console.log("create dir:" + cur_path);
                        fs.mkdirSync(cur_path);
                    }
                };

                cur_path = path.join(cur_path, fobj.base);
                console.log("current path:" + cur_path);

                if (fs.existsSync(cur_path) == false) {
                    console.log("create dir:" + cur_path);
                    fs.mkdirSync(cur_path);
                }

                arguments[arguments.length - 1]();
            } else {
                fs.writeFile(path.join(__dirname, file_name), zip.files[file_name]._data, arguments[arguments.length - 1]);
            }
        },
        function(err) {
            console.log(err || "unzip success");
        }
    )
}
以上。

沒有留言:

張貼留言