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

标签 go 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 字节的二进制文件)。

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

谢谢

最佳答案

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

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

关于go - 使用 golang 压缩一个文件文件夹会创建一个损坏的 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52411569/

相关文章:

perl - 如何使用 perl Archive::Zip 将文件添加到存档?

javascript - 使用归档器创建内存中的 .zip,然后将此文件发送到 Node 服务器上的 koa 客户端

go - 惯用的 Golang 协程

c# - 如何在 C# 中直接读取 ZIP 文件中的 XML 文件?

php - 在 PHP 中是否可以在不首先提取其内容的情况下检查 Zip 文件的内容?

PHP:按名称打开压缩文件(不解压)

mongodb - 将 mgo 与转换为 map[string]interface{} 的嵌套文档一起使用。如何遍历 map ?

Golang 上的 PHP gzdeflate/gzinflate 功能

http - 如何与http.Client建立长连接?

Go scanner - 空格的正确性?