Beispiel #1
0
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)
}
Beispiel #2
0
// @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)
}
Beispiel #3
0
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
}
Beispiel #4
0
// 文件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
}