猿问

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

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


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


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 的其他几个示例和通过 google 找到的链接,但我总是得到一个损坏的 zip。当我提取它时,我得到一个 135 字节的 zip,我得到 1 个 0 字节的二进制文件)。


如果有人可以帮助我找出我在这里缺少的东西,那就太好了。


千万里不及你
浏览 197回答 1
1回答

萧十郎

您需要列出并压缩文件,而不是目录。只需进行此调整即可忽略listFiles函数中的目录。if !info.IsDir() {     files = append(files, path) }
随时随地看视频慕课网APP

相关分类

Go
我要回答