file - 存档/压缩读取文件.zip : bad file descriptor

标签 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() 出现错误

read file.zip: bad file descriptor.

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

最佳答案

一次ReadCloser.Close被调用时,任何 *zip.File 结构都是无效的:

Close closes the Zip file, rendering it unusable for 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
}

关于file - 存档/压缩读取文件.zip : bad file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50930189/

相关文章:

java - 从文件读取到列表

go - 包含结构方法的变量

java - 将随机访问文件透明写入 zip 文件

python-2.7 - Python zipfile 模块无法提取带有中文字符的文件名

php - 在 WordPress 插件中强制下载文件

bash - 用 bash 解析 ICS 文件

android - 字符串值看起来相同,但彼此不是 ".equals()"

go - 如何避免 go.mod 文件中的间接依赖

go - 从DDD的角度来看,如何处理DB特定类型?

javascript - 在 Dropzone 中上传之前的 Zip 文件