in tools/extract.go [106:149]
func ExtractFileFromZip(filename string, target string) error {
archive, err := zip.OpenReader(filename)
if err != nil {
return err
}
trace("opened file", filename)
defer archive.Close()
for _, f := range archive.File {
if f.FileInfo().IsDir() {
trace("skipping dir", f.Name)
continue
}
file := filepath.Base(f.Name)
if file != target {
trace("skipping file", f.Name)
continue
}
trace("writing file", f.Name)
flags := os.O_RDWR | os.O_CREATE | os.O_TRUNC
dstFile, err := os.OpenFile(target, flags, 0755)
if err != nil {
return err
}
defer dstFile.Close()
fileInArchive, err := f.Open()
if err != nil {
return err
}
defer fileInArchive.Close()
if _, err := io.Copy(dstFile, fileInArchive); err != nil {
return err
}
return nil
}
return fmt.Errorf("file not found")
}