首页 > 解决方案 > 写入 bzip2 存档

问题描述

我正在处理多个文件,我需要使用此处提供的包将这些.json文件添加到单个存档中: https ://github.com/larzconwell/bzip2 。.zip

我已经参考了其他可能的解决方案和问题io.Writer.Close()以及.Flush()

使用的代码:

        if processedCounter%*filesInPackage == 0 || filesLeftToProcess == 0 {

            // Create empty zip file with numbered filename.
            emptyZip, err := os.Create(filepath.Join(absolutePathOutputDirectory, "package_"+strconv.Itoa(packageCounter)+".zip"))
            if err != nil {
                panic(err)
            }

            // Get list of .json filenames to be packaged:
            listOfProcessedJSON := listFiles(absolutePathInterDirectory, ".json")

            bzipWriter, err := bzip2.NewWriterLevel(emptyZip, 1)
            if err != nil {
                panic(err)
            }
            defer bzipWriter.Close()

            // Add listed files to the archive
            for _, file := range listOfProcessedJSON {
                // Read byte array from json file:
                JSONContents, err := ioutil.ReadFile(file)
                if err != nil {
                    fmt.Printf("Failed to open %s: %s", file, err)
                }

                // Write a single JSON to .zip:
                // Process hangs here!
                _, compressionError := bzipWriter.Write(JSONContents)
                if compressionError != nil {
                    fmt.Printf("Failed to write %s to zip: %s", file, err)
                    compressionErrorCounter++
                }

                err = bzipWriter.Close()
                if err != nil {
                    fmt.Printf("Failed to Close bzipWriter")
                }
            }

            // Delete intermediate .json files
            dir, err := ioutil.ReadDir(absolutePathInterDirectory)
            for _, d := range dir {
                os.RemoveAll(filepath.Join([]string{"tmp", d.Name()}...))
            }

            packageCounter++
        }

使用调试器似乎我的程序挂在以下行:

_, compressionError := bzipWriter.Write(JSONContents)

该软件包本身不提供使用示例,因此我的知识基于研究文档、StackOverflow 问题和不同的可用文章,例如:

https://www.golangprograms.com/go-program-to-compress-list-of-files-into-zip.html

让我知道是否有人知道此问题的可能解决方案。

标签: jsonfilegocompressionbzip2

解决方案


您混淆了格式和它们的作用,可能是因为它们包含一个公共子字符串“zip”。zip 是一种存档格式,旨在包含多个文件。bzip2 是单流压缩器,不是存档格式,只能存储一个文件。gzip 在这方面与 bzip2 相同。gzip、bzip2、xz 和其他单文件压缩器都通常与 tar 一起使用,以归档多个文件及其目录结构。tar 将多个文件和结构收集到一个未压缩的文件中,然后由您选择的压缩器对其进行压缩。

zip 格式的工作方式不同,其中存档格式位于外部,存档中的每个条目都是单独压缩的。

无论如何,单独使用 bzip2 包将无法归档多个文件。


推荐阅读