func WriteFile(path string, obj interface{}) (err error) { err = kmgFile.MkdirForFile(path) if err != nil { return err } f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(0666)) if err != nil { return } defer f.Close() encoder := gob.NewEncoder(f) return encoder.Encode(obj) }
// @deprecated // TODO 这个会多建一个空目录,这个算安全隐患. func DownloadFile(ctx *Context, remotePath string, localPath string) (err error) { err = kmgFile.MkdirForFile(localPath) if err != nil { kmgErr.LogErrorWithStack(err) return } f, err := os.Create(localPath) if err != nil { kmgErr.LogErrorWithStack(err) return } defer f.Close() return ctx.DownloadToWriter(remotePath, f) }
func ZipUncompressFromBytesToDir(zipB []byte, dir string, trimPrefix string) (err error) { buf := bytes.NewReader(zipB) reader, err := zip.NewReader(buf, int64(len(zipB))) if err != nil { kmgErr.LogErrorWithStack(err) return } for _, file := range reader.File { fullPath := filepath.Join(dir, strings.TrimPrefix(file.Name, trimPrefix)) if file.FileInfo().IsDir() { err = kmgFile.Mkdir(fullPath) if err != nil { kmgErr.LogErrorWithStack(err) return } continue } err = kmgFile.MkdirForFile(fullPath) if err != nil { kmgErr.LogErrorWithStack(err) return } rc, err := file.Open() if err != nil { kmgErr.LogErrorWithStack(err) return err } f, err := os.Create(fullPath) if err != nil { kmgErr.LogErrorWithStack(err) rc.Close() return err } _, err = io.Copy(f, rc) rc.Close() f.Close() if err != nil { kmgErr.LogErrorWithStack(err) return err } } return nil }
// 文件ttl缓存实现,每次都会读取文件,由于没有泛型,此处需要调用者自行解决序列化问题. // 2.存储在文件里面,以便重启之后可以使用. // 3.当缓存存在的时候,并且ttl在时间范围内,使用ttl,当缓存不存在的时候,使用回调拉取数据.当缓存过期的时候,使用回调拉取数据. // 4.每一次使用都会读取文件 // 5.当某一次缓存拉取出现错误的时候,直接返回错误给调用者 func FileTtlCache(key string, f func() (b []byte, ttl time.Duration, err error)) (b []byte, err error) { entry := ttlCacheEntryV2{} cacheFilePath := getFileTtlCachePath(key) now := time.Now() err = kmgGob.ReadFile(cacheFilePath, &entry) if err == nil && entry.Timeout.After(now) { return entry.Value, nil } b, ttl, err := f() if err != nil { return nil, err } entry.Value = b entry.Timeout = now.Add(ttl) err = kmgFile.MkdirForFile(cacheFilePath) if err != nil { return nil, err } err = kmgGob.WriteFile(cacheFilePath, entry) if err != nil { return nil, err } return b, nil }