• golang zip 解压、压缩文件


    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
    }
    --------------------- 

  • 相关阅读:
    [转载]在sharepoint里增加PDF图标显示收藏主题
    CuratorFramework开源Zookeeper快速开发框架介绍
    Zookeeper和CuratorFramework实践之:分布式消息队列
    Zookeeper和CuratorFramework实践系列之: 配置管理
    JS 文字向上滚动代码
    sql递归查询问题
    双线单IP和双线双IP机房的区别
    js获取标准北京时间
    ftp 21端口被占用解决办法
    "由于没有远程桌面授权服务器可以提供许可证..."不能远程桌面解决方法
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10995883.html
Copyright © 2020-2023  润新知