ioutil.ReadAll дает 0 байт для читателя tar - PullRequest
0 голосов
/ 26 июня 2018

Я создаю tar-файл в памяти:

var buf bytes.Buffer
tw := tar.NewWriter(&buf)
files := map[string][]byte{
    "1.txt": []byte("11"),
    "2.txt": []byte("2"),
}
for fileName, bStr := range files {
    b := []byte(bStr)
    hdr := &tar.Header{
        Name: fileName,
        Mode: 0600,
        Size: int64(len(b)),
    }
    log.Printf("include the file to the tar %+v\n", hdr)
    if err := tw.WriteHeader(hdr); err != nil {
        err := fmt.Errorf("couldn't write a header: %+v", err)
        log.Println(err)
        return
    }
    if _, err := tw.Write(b); err != nil {
        err := fmt.Errorf("couldn't write file %+v to tar: %+v", fileName, err)
        log.Println(err)
        return
    }
}
if err := tw.Close(); err != nil {
    log.Println(err)
    return
}

Но не удалось преобразовать этот файл tar в байты. детская площадка 1

    b, err := ioutil.ReadAll(tr)
    if err != nil {
        err = fmt.Errorf("could not read file data")
        log.Println(err)
        return
    }
    log.Printf("read %+v bytes", len(b))

Он просто печатает 0 байтов:

2018/06/26 16:57:04 main.go:67: read 0 bytes

Но я могу читать содержимое tar, файл за файлом:

for {
    hdr, err := tr.Next()
    if err == io.EOF {
        break // End of archive
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Contents of %s:\n", hdr.Name)
    if _, err := io.Copy(os.Stdout, tr); err != nil {
        log.Fatal(err)
    }
    fmt.Println()
}

детская площадка 2

печатает

Contents of 2.txt:
2
Contents of 1.txt:
11

как и ожидалось.

Так что это означает, что мой tar-файл не пустой. Мне просто нужно преобразовать его в байты для дальнейшего продвижения в хранилище glcoud. Но, похоже, я бездельничаю с читателями и писателями и с трудом могу понять, как преобразовать tar в байты в памяти.

1 Ответ

0 голосов
/ 26 июня 2018

Программа записывает архив в байт. Буфер . Вызовите Buffer.Bytes () , чтобы получить байты архива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...