(ctx context.Context, filter ExtractFileFilter, input, output string)
| 15 | ) |
| 16 | |
| 17 | func xzip(ctx context.Context, filter ExtractFileFilter, input, output string) bool { |
| 18 | |
| 19 | if !checkFileHead(input, M_ZIP) { |
| 20 | return false |
| 21 | } |
| 22 | |
| 23 | rf, err := zip.OpenReader(input) |
| 24 | if err != nil { |
| 25 | logs.Warn(err) |
| 26 | return false |
| 27 | } |
| 28 | defer rf.Close() |
| 29 | |
| 30 | for _, f := range rf.File { |
| 31 | |
| 32 | select { |
| 33 | case <-ctx.Done(): |
| 34 | return false |
| 35 | default: |
| 36 | } |
| 37 | |
| 38 | if f.FileInfo().IsDir() { |
| 39 | continue |
| 40 | } |
| 41 | |
| 42 | entryName := f.Name |
| 43 | |
| 44 | if f.Flags == 0 { |
| 45 | gbk := mahonia.NewDecoder("gbk").ConvertString(f.Name) |
| 46 | _, cdata, _ := mahonia.NewDecoder("utf-8").Translate([]byte(gbk), true) |
| 47 | entryName = string(cdata) |
| 48 | } |
| 49 | |
| 50 | fp, err := resolveExtractPath(output, entryName) |
| 51 | if err != nil { |
| 52 | logs.Warn(err) |
| 53 | continue |
| 54 | } |
| 55 | |
| 56 | if filter != nil && !filter(fp) { |
| 57 | continue |
| 58 | } |
| 59 | |
| 60 | fr, err := f.Open() |
| 61 | if err != nil { |
| 62 | logs.Warn(err) |
| 63 | continue |
| 64 | } |
| 65 | |
| 66 | os.MkdirAll(filepath.Dir(fp), 0777) |
| 67 | fw, err := os.Create(fp) |
| 68 | if err != nil { |
| 69 | logs.Warn(err) |
| 70 | fr.Close() // 提前退出时手动关闭 |
| 71 | continue |
| 72 | } |
| 73 | |
| 74 | _, err = io.Copy(fw, fr) |
no test coverage detected