为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
千万里不及你 2023-04-04 17:22:38
如何正确地将文件压缩到包含子目录的文件夹中。我有一个具有以下结构的本地文件夹:folder/hello/folder/hello/world/folder/hello/world/helloword.txtfolder/index.txt这是我的代码:package mainimport (    "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 字节的二进制文件)。如果有人可以帮助我找出我在这里缺少的东西,那就太好了。
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超12个赞

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

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


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信