1 package main 2 3 import ( 4 "archive/zip" 5 "io" 6 "os" 7 "path" 8 "syscall" 9 10 "vimagination.zapto.org/byteio" 11 "vimagination.zapto.org/minewebgen/internal/data" 12 ) 13 14 func writeError(w *byteio.StickyLittleEndianWriter, err error) { 15 w.WriteUint8(0) 16 data.WriteString(w, err.Error()) 17 } 18 19 func moveFile(from, to string) error { 20 err := os.Rename(from, to) 21 if e, ok := err.(*os.LinkError); !ok || e.Err != syscall.EXDEV { 22 return err 23 } 24 fromf, err := os.Open(from) 25 if err != nil { 26 return err 27 } 28 defer fromf.Close() 29 tof, err := os.Create(to) 30 if err != nil { 31 return err 32 } 33 defer tof.Close() 34 _, err = io.Copy(tof, fromf) 35 return err 36 } 37 38 func unzip(zr *zip.Reader, dest string) error { 39 for _, f := range zr.File { 40 name := path.Join(dest, f.Name) 41 if f.FileInfo().IsDir() { 42 err := os.MkdirAll(name, f.Mode()) 43 if err != nil { 44 return err 45 } 46 continue 47 } 48 inf, err := f.Open() 49 if err != nil { 50 return err 51 } 52 of, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) 53 if err != nil { 54 inf.Close() 55 return err 56 } 57 _, err = io.Copy(of, inf) 58 inf.Close() 59 of.Close() 60 if err != nil { 61 return err 62 } 63 } 64 return nil 65 }