用golang压缩文件的文件夹会创建损坏的zip

时间:2018-09-19 17:48:37

标签: go zip zipfile

如何正确将文件压缩到带有子目录的文件夹中。

我有一个具有以下结构的本地文件夹:

folder/hello/
folder/hello/world/
folder/hello/world/helloword.txt
folder/index.txt

这是我的代码:

package main

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

func main() {

    files, err := listFiles("./folder")
    if err != nil {
        panic(err)
    }

    zipMe(files, "test.zip")

    for _, f := range files {
        fmt.Println(f)
    }
    fmt.Println("Done!")
}

func listFiles(root string) ([]string, error) {
    var files []string

    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        files = append(files, path)
        return nil
    })
    if err != nil {
        return nil, err
    }
    return files, nil

}

func zipMe(filepaths []string, target string) error {

    flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC
    file, err := os.OpenFile(target, flags, 0644)

    if err != nil {
        return fmt.Errorf("Failed to open zip for writing: %s", err)
    }
    defer file.Close()

    zipw := zip.NewWriter(file)
    defer zipw.Close()

    for _, filename := range filepaths {
        if err := addFileToZip(filename, zipw); err != nil {
            return fmt.Errorf("Failed to add file %s to zip: %s", filename, err)
        }
    }
    return nil

}

func addFileToZip(filename string, zipw *zip.Writer) error {
    file, err := os.Open(filename)

    if err != nil {
        return fmt.Errorf("Error opening file %s: %s", filename, err)
    }
    defer file.Close()

    wr, err := zipw.Create(filename)
    if err != nil {

        return fmt.Errorf("Error adding file; '%s' to zip : %s", filename, err)
    }

    if _, err := io.Copy(wr, file); err != nil {
        return fmt.Errorf("Error writing %s to zip: %s", filename, err)
    }

    return nil
}

这将创建一个无法解压缩的损坏的zip(我在mac os上运行,但这没有什么关系)。 我也尝试了stackoverflow和其他通过谷歌找到的链接的其他几个例子,但是我总是得到一个损坏的zip。提取时,我得到一个135字节的zip压缩文件,得到1个0字节的二进制文件。

如果有人能帮助我找出我在这里想念的地方,那就太好了。

Thx

1 个答案:

答案 0 :(得分:0)

您需要列出并压缩文件,而不是目录。只需进行此调整即可忽略listFiles函数中的目录。

if !info.IsDir() {
    files = append(files, path)
}