代码之家  ›  专栏  ›  技术社区  ›  silverfighter

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

  •  0
  • silverfighter  · 技术社区  · 6 年前

    如何正确地将文件压缩到包含子目录的文件夹中。

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

    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
    }
    

    我还尝试了其他几个例子,从stackoverflow和通过谷歌找到的链接,但我总是得到一个坏拉链。我得到一个135字节的zip文件,当我解压缩它时,我得到一个0字节的二进制文件)。

    如果有人能帮我找出我在这里遗漏了什么,那就太好了。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   RayfenWindspear    6 年前

    文件夹 ,而不是目录。只需进行此调整,即可忽略 listFiles 功能。

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