1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package gfpool
- import (
- "fmt"
- "os"
- "time"
- "github.com/gogf/gf/v2/errors/gerror"
- )
- // Open creates and returns a file item with given file path, flag and opening permission.
- // It automatically creates an associated file pointer pool internally when it's called first time.
- // It retrieves a file item from the file pointer pool after then.
- func Open(path string, flag int, perm os.FileMode, ttl ...time.Duration) (file *File, err error) {
- var fpTTL time.Duration
- if len(ttl) > 0 {
- fpTTL = ttl[0]
- }
- // DO NOT search the path here wasting performance!
- // Leave following codes just for warning you.
- //
- // path, err = gfile.Search(path)
- // if err != nil {
- // return nil, err
- // }
- pool := pools.GetOrSetFuncLock(
- fmt.Sprintf("%s&%d&%d&%d", path, flag, fpTTL, perm),
- func() interface{} {
- return New(path, flag, perm, fpTTL)
- },
- ).(*Pool)
- return pool.File()
- }
- // Get returns a file item with given file path, flag and opening permission.
- // It retrieves a file item from the file pointer pool after then.
- func Get(path string, flag int, perm os.FileMode, ttl ...time.Duration) (file *File) {
- var fpTTL time.Duration
- if len(ttl) > 0 {
- fpTTL = ttl[0]
- }
- f, found := pools.Search(fmt.Sprintf("%s&%d&%d&%d", path, flag, fpTTL, perm))
- if !found {
- return nil
- }
- fp, _ := f.(*Pool).pool.Get()
- return fp.(*File)
- }
- // Stat returns the FileInfo structure describing file.
- func (f *File) Stat() (os.FileInfo, error) {
- if f.stat == nil {
- return nil, gerror.New("file stat is empty")
- }
- return f.stat, nil
- }
- // Close puts the file pointer back to the file pointer pool.
- func (f *File) Close(close ...bool) error {
- if len(close) > 0 && close[0] {
- f.File.Close()
- }
- if f.pid == f.pool.id.Val() {
- return f.pool.pool.Put(f)
- }
- return nil
- }
|