存档/ zip读取file.zip:错误的文件描述符

时间:2018-06-19 13:52:54

标签: file go zip

我编写了一个将zip存档读取到map[string]*zip.File的功能。

func ReadZip(file string) (map[string]*zip.File, error) {
    r, err := zip.OpenReader(file)
    if err != nil {
        return nil, err
    }
    defer r.Close()
    files := make(map[string]*zip.File)
    for _, f := range r.File {
        files[f.Name] = f
    }
    return files, nil
}

但是当我尝试打开文件infoRC, err := f["info.json"].Open()时出现错误

  

读取file.zip:错误的文件描述符。

是否有更好的方法来读取zip存档?

1 个答案:

答案 0 :(得分:3)

一旦调用ReadCloser.Close,任何*zip.File结构均无效:

  

关闭会关闭Zip文件,使其无法用于I / O。

您需要:

  1. 只要您想读取ZIP条目,就保持打开r,或者
  2. 制作所有zip文件内容的内存中/临时文件副本

后一种选择的示例:

func ReadZip(file string) (map[string][]byte, error) {
    r, err := zip.OpenReader(file)
    if err != nil {
        return nil, err
    }
    defer r.Close()
    files := make(map[string][]byte)
    for _, f := range r.File {
        fc, err := f.Open()
        if err != nil {
            return nil, err
        }
        contents, err := ioutil.ReadAll(fc)
        fc.Close()
        if err != nil {
            return nil, err
        }
        files[f.Name] = contents
    }
    return files, nil
}