package utils

import (
    "archive/zip"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "os"
    "strings"
)

//压缩文件
//files 文件数组,可以是不同dir下的文件或者文件夹
//dest 压缩文件存放地址
func Compress(files []*os.File, dest string) error {
    d, _ := os.Create(dest)
    defer d.Close()
    w := zip.NewWriter(d)
    defer w.Close()
    for _, file := range files {
        err := compress(file, "", w)
        if err != nil {
            return err
        }
    }
    return nil
}

func compress(file *os.File, prefix string, zw *zip.Writer) error {
    info, err := file.Stat()
    if err != nil {
        return err
    }
    if info.IsDir() {
        prefix = prefix + "/" + info.Name()
        fileInfos, err := file.Readdir(-1)
        if err != nil {
            return err
        }
        for _, fi := range fileInfos {
            f, err := os.Open(file.Name() + "/" + fi.Name())
            if err != nil {
                return err
            }
            err = compress(f, prefix, zw)
            if err != nil {
                return err
            }
        }
    } else {
        header, err := zip.FileInfoHeader(info)
        header.Name = prefix + "/" + header.Name
        if err != nil {
            return err
        }
        writer, err := zw.CreateHeader(header)
        if err != nil {
            return err
        }
        _, err = io.Copy(writer, file)
        file.Close()
        if err != nil {
            return err
        }
    }
    return nil
}

//解压
func DeCompress(zipFile, dest string) (err error) {
    //目标文件夹不存在则创建
    if _, err = os.Stat(dest); err != nil {
        if os.IsNotExist(err) {
            os.MkdirAll(dest, 0755)
        }
    }

reader, err := zip.OpenReader(zipFile)
    if err != nil {
        return err
    }

defer reader.Close()

for _, file := range reader.File {
        //    log.Println(file.Name)

if file.FileInfo().IsDir() {

err := os.MkdirAll(dest+"/"+file.Name, 0755)
            if err != nil {
                log.Println(err)
            }
            continue
        } else {

err = os.MkdirAll(getDir(dest+"/"+file.Name), 0755)
            if err != nil {
                return err
            }
        }

rc, err := file.Open()
        if err != nil {
            return err
        }
        defer rc.Close()

filename := dest + "/" + file.Name
        //err = os.MkdirAll(getDir(filename), 0755)
        //if err != nil {
        //    return err
        //}

w, err := os.Create(filename)
        if err != nil {
            return err
        }
        defer w.Close()

_, err = io.Copy(w, rc)
        if err != nil {
            return err
        }
        //w.Close()
        //rc.Close()
    }
    return
}

func getDir(path string) string {
    return subString(path, 0, strings.LastIndex(path, "/"))
}

func subString(str string, start, end int) string {
    rs := []rune(str)
    length := len(rs)

if start < 0 || start > length {
        panic("start is wrong")
    }

if end < start || end > length {
        panic("end is wrong")
    }

return string(rs[start:end])
}

func CompressZip(src string, dest string) (err error) {

f, err := ioutil.ReadDir(src)
    if err != nil {
        log.Println(err)
    }

fzip, _ := os.Create(dest)
    w := zip.NewWriter(fzip)

defer fzip.Close()
    defer w.Close()
    for _, file := range f {
        fw, _ := w.Create(file.Name())
        filecontent, err := ioutil.ReadFile(src + file.Name())
        if err != nil {
            log.Println(err)
        }
        _, err = fw.Write(filecontent)

if err != nil {
            log.Println(err)
        }
        //    log.Println(n)
    }
    return
}
---------------------

golang zip 解压、压缩文件的更多相关文章

  1. linux解压/压缩文件

    1.*.tar 用 tar –xvf 解压  2.*.gz 用 gzip -d或者gunzip 解压  3.*.tar.gz和*.tgz 用 tar –xzf 解压  4.*.bz2 用 bzip2 ...

  2. java利用zip解压slpk文件

    public static void main(String[] args) { File file = new File("C:\\Users\\Administrator\\Deskto ...

  3. Linux 解压 压缩文件

    来源于:http://blog.csdn.net/mmllkkjj/article/details/6768294/ 解压 tar –xvf file.tar //解压 tar包tar -xzvf f ...

  4. Qt 解压/压缩文件

    很久没有在博客园写随笔了,今天项目需要解压和压缩文件,所以去了解哈. 参考的是大神的代码:https://yq.aliyun.com/articles/24428. 使用的是 QuaZIP类. 类 说 ...

  5. c# 用DotNetZip来解压/压缩文件

    //https://archive.codeplex.com/?p=dotnetzip //最新在Nuget 下载DotNetZip using Ionic.Zip; private void but ...

  6. Linux zip解压/压缩并指定目录

    方法如下: 压缩并指定目录举例:zip -r /home/kms/kms.zip /home/kms/server/kms 解压并指定目录 举例:unzip /home/kms/kms.zip -d ...

  7. 解压压缩文件报错gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now

    压缩包是直接weget 后面加官网上的tar包地址获取的  [root@xuegod43 ~]# tar -zxvf /home/hadoop/hadoop-2.6.5-src.tar.gz gzip ...

  8. Bug :”解压压缩文件失败: cpio; 在头中不存在归档“

    问题描述: 在rpm包目录下执行rpm -ivh *rpm -force时,出现标题错误 解决办法: *src.rpm包也就源码包不能被直接进行安装,需要先将src.rpm包进行编译生成二进制的rpm ...

  9. 解决ubuntu中zip解压的中文乱码问题

    转自解决ubuntu中zip解压的中文乱码问题 在我的ubuntu12.10中,发现显示中文基本都是正常的,只有在解压windows传过来的zip文件时,才会出现乱码.所以,我用另一个方法解决中文乱码 ...

随机推荐

  1. Android 网络调试 adb tcpip 开启方法

    查看ip地址:adb shell ifconfig 1.连接USB数据线,打开usb调试,使用windows的“运行”命令行方式:(此方法需配置adb环境变量,也可直接进入adb工具目录执行\andr ...

  2. [Usaco2013 DEC] Vacation Planning

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4093 [算法] 对于k个枢纽 , 分别在正向图和反向图上跑dijkstra最短路 , ...

  3. 细数vue爬坑之路<坑路大集合>

    坑爹集锦一: npm出现Newline required at end of file but not found错误 原因:eslint语法错误(vue为后缀名的组件结尾没有换行) 解决办法:在结尾 ...

  4. Django Cache缓存系统介绍及Memcached使用

    在动态网站中,用户每次请求一个页面,服务器都会执行以下操作:查询数据库,渲染模板,执行业务逻辑,最后生成用户可查看的页面. 这会消耗大量的资源,当访问用户量非常大时,就要考虑这个问题了. 缓存就是为了 ...

  5. 说说Java观察者模式

    观察者模式是对象行为模式中的一种,在平时项目中经常被用来解耦对象之间的依赖. 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新.别名:De ...

  6. gdb core调试

    原文链接 http://blog.163.com/lanka83/blog/static/32637615200801793020182/http://blog.csdn.net/taina2008/ ...

  7. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序

    题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...

  8. Oracle第三方ado.net数据提供程序(转)

    原文地址:http://www.infoq.com/cn/news/2009/06/oracleclient_deprecated 这项决定有部分原因是基于目前Oracle的第三方ADO.NET数据提 ...

  9. [App Store Connect帮助]七、在 App Store 上发行(3.3)提交至“App 审核”:解决 App 拒绝问题

    如果“App 审核”或“Beta 版 App 审核”拒绝了您的 App,您可以与 Apple 沟通并在解决方案中心中解决问题. 来自 Apple 的通讯信息包含有关 App 拒绝的信息,其中包括该 A ...

  10. docker速记

    1.docker:一个轻量级的虚拟机.是一个容器 2.Linux系统包括—RedHat(商业版).Centos.Ubuntu 3.docker比作码头的集装箱,image镜像就是基石,images类似 ...