gpt4 book ai didi

go - 使用 golang io.pipe 到 tar 文件的错误

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:58 24 4
gpt4 key购买 nike

我一直在测试代码,使用 io.Pipe 将文件压缩并压缩到压缩包中,然后使用 tar 实用程序解压缩。下面的代码通过了,但是untaring过程一直在进行

错误:tar:截断的输入文件(需要 1050624 字节,只有 0 个可用)
tar: 错误退出从以前的错误中延迟。

这个问题真的快把我逼疯了。已经两周了。我真的需要帮助调试。

谢谢。

开发环境:go版本go1.9 darwin/amd64

package main

import (
"archive/tar"
"compress/gzip"
"fmt"
"io"
"log"
"os"
"path/filepath"
"testing"
)

func testTarGzipPipe2(t *testing.T) {
src := "/path/to/file/folder"

pr, pw := io.Pipe()
gzipWriter := gzip.NewWriter(pw)
defer gzipWriter.Close()
tarWriter := tar.NewWriter(gzipWriter)
defer tarWriter.Close()

status := make(chan bool)

go func() {
defer pr.Close()
// tar to local disk
tarFile, err := os.OpenFile("/path/to/tar/ball/test.tar.gz", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
log.Fatal(err)
}
defer tarFile.Close()
if _, err := io.Copy(tarFile, pr); err != nil {
log.Fatal(err)
}

status <- true
}()

err := filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}

header, err := tar.FileInfoHeader(info, info.Name())
if err != nil {
return err
}

// header.Name = strings.TrimPrefix(strings.Replace(path, src, "", -1), string(filepath.Separator))

if err := tarWriter.WriteHeader(header); err != nil {
return err
}

if info.Mode().IsDir() {
return nil
}

fmt.Println(path)
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close()

if _, err := io.Copy(tarWriter, f); err != nil {
return err
}

return nil
})

if err != nil {
log.Fatal(err)
}

pw.Close()
<-status
}

最佳答案

您将在 gzipWritertarWriter 上的延迟关闭调用之前关闭管道。没有错误,因为您没有检查这些关闭调用中的任何一个的错误。您需要依次关闭 tarWritergzipWriterPipeWriter

但是,此代码中根本没有管道的理由,如果直接写入文件,则可以完全删除 goroutine 和相关联的协调。

tarFile, err := os.OpenFile("/tmp/test.tar.gz", os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
log.Fatal(err)
}
defer tarFile.Close()

gzipWriter := gzip.NewWriter(tarFile)
defer gzipWriter.Close()
tarWriter := tar.NewWriter(gzipWriter)
defer tarWriter.Close()

关于go - 使用 golang io.pipe 到 tar 文件的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46167418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com