golang zip 解压压缩文件

Posted hyhy904

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

--------------------- 

以上是关于golang zip 解压压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

Golang zip 压缩与解压

golang zip 压缩,解压(含目录文件)

golang zip 解压压缩文件

golang zip 解压压缩文件

压缩文件zip怎么解压

zip压缩包怎么解压