// packDir packs a directory and its subdirectories and files // recursively to zip.Writer. func packDir(srcPath string, recPath string, zw *zip.Writer, fn cae.HookFunc) error { dir, err := os.Open(srcPath) if err != nil { return err } defer dir.Close() fis, err := dir.Readdir(0) if err != nil { return err } for _, fi := range fis { if cae.IsFilter(fi.Name()) { continue } curPath := srcPath + "/" + fi.Name() tmpRecPath := filepath.Join(recPath, fi.Name()) if err = fn(curPath, fi); err != nil { continue } if fi.IsDir() { if err = packFile(srcPath, tmpRecPath, zw, fi); err != nil { return err } err = packDir(curPath, tmpRecPath, zw, fn) } else { err = packFile(curPath, tmpRecPath, zw, fi) } if err != nil { return err } } return nil }
// AddFile adds a file entry to ZipArchive. func (z *ZipArchive) AddFile(fileName, absPath string) error { if cae.IsFilter(absPath) { return nil } f, err := os.Open(absPath) if err != nil { return err } defer f.Close() fi, err := f.Stat() if err != nil { return err } file := new(File) file.FileHeader, err = zip.FileInfoHeader(fi) if err != nil { return err } file.Name = fileName file.absPath = absPath z.AddEmptyDir(path.Dir(fileName)) isExist := false for _, f := range z.files { if fileName == f.Name { f = file isExist = true break } } if !isExist { z.files = append(z.files, file) } z.updateStat() return nil }