Go压缩解压文件夹

Go的archive/zip包提供了文件的压缩和解压,本例涉及到的API如下(仅列出重要部分):

// zip.Writer用来写入压缩包
type Writer struct {
    // ...
}
// Create方法用来在zip包里创建文件,返回的io.Writer用来写内容
func (w *Writer) Create(name string) (io.Writer, error)

// zip.Reader用来读取压缩包
type Reader struct {
    File    []*File  // File数组保存了所有的文件信息
    // ...
}
// zip.File 表示压缩包中的文件
type File struct {
    // ...
}
// 打开zip中的文件以读取,返回的io.ReadCloser用来读取内容
func (f *File) Open() (io.ReadCloser, error)

代码如下:

package main

import (
    "archive/zip"
    "io"
    "log"
    "os"
    "path/filepath"
)

func zipDir(dir, zipFile string) {

    fz, err := os.Create(zipFile)
    if err != nil {
        log.Fatalf("Create zip file failed: %s\n", err.Error())
    }
    defer fz.Close()

    w := zip.NewWriter(fz)
    defer w.Close()

    filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            fDest, err := w.Create(path[len(dir)+1:])
            if err != nil {
                log.Printf("Create failed: %s\n", err.Error())
                return nil
            }
            fSrc, err := os.Open(path)
            if err != nil {
                log.Printf("Open failed: %s\n", err.Error())
                return nil
            }
            defer fSrc.Close()
            _, err = io.Copy(fDest, fSrc)
            if err != nil {
                log.Printf("Copy failed: %s\n", err.Error())
                return nil
            }
        }
        return nil
    })
}

func unzipDir(zipFile, dir string) {

    r, err := zip.OpenReader(zipFile)
    if err != nil {
        log.Fatalf("Open zip file failed: %s\n", err.Error())
    }
    defer r.Close()

    for _, f := range r.File {
        func() {
            path := dir + string(filepath.Separator) + f.Name
            os.MkdirAll(filepath.Dir(path), 0755)
            fDest, err := os.Create(path)
            if err != nil {
                log.Printf("Create failed: %s\n", err.Error())
                return
            }
            defer fDest.Close()

            fSrc, err := f.Open()
            if err != nil {
                log.Printf("Open failed: %s\n", err.Error())
                return
            }
            defer fSrc.Close()

            _, err = io.Copy(fDest, fSrc)
            if err != nil {
                log.Printf("Copy failed: %s\n", err.Error())
                return
            }
        }()
    }
}

func main() {
    zipDir("F:\\dumps", "F:\\dumps.zip")
    unzipDir("F:\\dumps.zip", "F:\\dumps_copy")
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值