我已经编写了一个函数来将 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.
您需要:
- 只要您想阅读 ZIP 条目,请保持
r
打开,或者 - 制作所有 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/