大神们,noder小白求支援
发布于 5 天前 作者 Hfimy 239 次浏览 来自 问答

大家好,我是Hfimy,第一次发帖子,先说点题外话,很开心发现了这个社区,嗯,看帖子就知道有很多大神,接触node不久,两个月左右, 当时学了十几天便通过校招出来实习了,但感觉技术实在是灰常菜,工作基本都是边学边做,,,这让我时常郁闷。啥也不会,心酸,有时候就想着,要不回学校吧,回去还能玩玩游戏,撩撩妹,现在考研结束,特么同学们都在浪。唉,长路漫漫,没啥作伴。。。不管怎么样,我很开心成为这里的一员,希望能在node里走的越来越远,早日脱离菜鸟。在这勉励一下自己,以及那些和我一样刚学习node的新手,坚持下去,加油。。。。!!

下面就是我想问的问题了,这两天组长让我写个小程序,功能是从某个服务器地址目录下,根据配置文件里的dependencies里的软件名,版本号,类似于package.json里的dependencies一样,将对应的压缩文件解压到指定的目录。(暂时先不考虑对给定配置文件的解析以及软件的依赖关系),,先就实现这个功能,期间有两个问题想请教大家,第一个是解压缩,我用的是第三方包unzip,但是只支持解压.zip,我也试了一下zlib里面的zlib.Gunzip,结果有的解压报错。。。(不知道是不是我自己写错了),有没有大神知道哪些包能支持多种格式的解压缩文件吗,比如.zip .7z .gz,

第二个就比较蛋疼了,我现在写的程序输入的版本号是固定的,比如v1.0.0,它是在服务器某个地址下真实存在的,比如目录结构是src/softwarename/v1.0.0/software.zip,但实际上呢,src/softwarename/这个目录下可能有很多版本,比如v1.0.1,v2.1.0.1,等这种语义化版本,如果配置文件里写的是v1.*,或者加那些~ , ^ ,> ,小弟实在是hold不住呀,难道要遍历src/softwarename/这个目录,然后再用正则一个一个去匹配下面存在的版本号,,不知道有没有大神写过这种包,能根据传入的版本号比如v1.*直接找到这个目录中匹配的>=v1.0.0,< v2.0.0的优先级最高且存在的目录名。。。或者哪个大神指点一下,实在是不会写呀。。

下面是实现从给定服务器目录下,将压缩文件解压到指定目录的代码

const fs=require('fs');
const stat=fs.stat;
const path=require('path');
const Unzip=require('unzip');
//const sumver=require('semver');
const root='/\\202.11.4.65\\yf1'

//创建多级目录  递归与回调
var mkdirs = function(dirpath, callback) {
    fs.exists(dirpath, function(exists) {
        if(exists) {
                callback();
        } else {
                //尝试创建父目录,然后再创建当前目录
                mkdirs(path.dirname(dirpath), function(){
                        fs.mkdir(dirpath,callback);
                 });
        }
    })
};

var unzip=function (name,version,dst,cb) {
    //传入的参数分别为软件名字,版本和解压到的目录
    var src=path.join(root,name,version);
    fs.readdir(src,(err,paths)=>{
        if(err){
            throw err;
        }
        paths.forEach(function(_path){
            var _src=path.join(src,_path);
            stat(_src,(err,stats)=>{
                if(err){
                    throw err;
                }
                if(stats.isFile()&&path.extname(_src)==='.zip'){
                    _dst=path.join(dst,name,version);
                    fs.access(_dst,fs.F_OK,(non)=>{
                        if(non){
                            mkdirs(_dst,()=>{});
                        }
                    });
                    var extract=Unzip.Extract({path:_dst});
                    console.log(_src+'  正在解压中...');
                    console.time(_src);
                    fs.createReadStream(_src).pipe(extract);
                    //解压异常处理
                    extract.on('error',(err)=>{
                        if(err){
                            throw err;
                        }
                    })
                    extract.on('finish',()=>{
                        console.timeEnd(_src);
                        cb(_src);
                    })
                }
            })
        })
    })
}

unzip('mongoDB','v3.0.0','F:\\soft',(src)=>{
    console.log(src+'  解压完成');
});

unzip('node','v6.2.0','F:\\soft',(src)=>{
    console.log(src+'  解压完成');
});
module.exports=unzip;

暂时实现了基本的从服务器那边解压.zip文件到指定目录,关于遇到的问题有没有大神指导下, 或者整个程序本身有没有更好的实现方法

3 回复

你需要 mkdirp 模块

@steambap mkdirp模块?干吗的,创建多级目录?

@steambap 好吧,创建多级目录,然而这并不是重点。。。

回到顶部