基本介绍
gfile
文件管理组件提供了更加丰富的文件/目录操作能力。
使用方式:
import "github.com/gogf/gf/v2/os/gfile"
接口文档:
https://pkg.go.dev/github.com/gogf/gf/v2/os/gfile
以下常用方法列表,文档更新可能滞后于代码新特性,更多的方法及示例请参考代码文档: https://pkg.go.dev/github.com/gogf/gf/v2/os/gfile
内容管理
GetContents
- 说明:读取指定路径文件内容,以字符串形式返回。
- 格式:
func GetContents(path string) string
- 示例:
func ExampleGetContents() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// It reads and returns the file content as string.
// It returns empty string if it fails reading, for example, with permission or IO error.
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example content
}
GetContentsWithCache
- 说明:带缓存获取文件内容,可设置缓存超时,文件发生变化自动清除缓存。
- 格式:
func GetContentsWithCache(path string, duration ...time.Duration) string
- 示例:
func ExampleGetContentsWithCache() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_cache")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// It reads the file content with cache duration of one minute,
// which means it reads from cache after then without any IO operations within on minute.
fmt.Println(gfile.GetContentsWithCache(tempFile, time.Minute))
// write new contents will clear its cache
gfile.PutContents(tempFile, "new goframe example content")
// There's some delay for cache clearing after file content change.
time.Sleep(time.Second * 1)
// read contents
fmt.Println(gfile.GetContentsWithCache(tempFile))
// May Output:
// goframe example content
// new goframe example content
}
GetBytesWithCache
- 说明:带缓存获取文件内容,可设置缓存超时,文件发生变化自动清除缓存,返回[]byte。
- 格式:
func GetBytesWithCache(path string, duration ...time.Duration) []byte
- 示例:
func ExampleGetBytesWithCache() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_cache")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// It reads the file content with cache duration of one minute,
// which means it reads from cache after then without any IO operations within on minute.
fmt.Println(gfile.GetBytesWithCache(tempFile, time.Minute))
// write new contents will clear its cache
gfile.PutContents(tempFile, "new goframe example content")
// There's some delay for cache clearing after file content change.
time.Sleep(time.Second * 1)
// read contents
fmt.Println(gfile.GetBytesWithCache(tempFile))
// Output:
// [103 111 102 114 97 109 101 32 101 120 97 109 112 108 101 32 99 111 110 116 101 110 116]
// [110 101 119 32 103 111 102 114 97 109 101 32 101 120 97 109 112 108 101 32 99 111 110 116 101 110 116]
}
GetBytes
- 说明:读取指定路径文件内容,以字节形式返回。
- 格式:
func GetBytes(path string) []byte
- 示例:
func ExampleGetBytes() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// It reads and returns the file content as []byte.
// It returns nil if it fails reading, for example, with permission or IO error.
fmt.Println(gfile.GetBytes(tempFile))
// Output:
// [103 111 102 114 97 109 101 32 101 120 97 109 112 108 101 32 99 111 110 116 101 110 116]
}
GetBytesTilChar
- 说明:以某个字符定位截取指定长度的文件内容以字节形式返回
- 格式:
func GetBytesTilChar(reader io.ReaderAt, char byte, start int64) ([]byte, int64)
- 示例:
func ExampleGetBytesTilChar() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
f, _ := gfile.OpenWithFlagPerm(tempFile, os.O_RDONLY, gfile.DefaultPermOpen)
// GetBytesTilChar returns the contents of the file as []byte
// until the next specified byte `char` position.
char, i := gfile.GetBytesTilChar(f, 'f', 0)
fmt.Println(char)
fmt.Println(i)
// Output:
// [103 111 102]
// 2
}
GetBytesByTwoOffsets
- 说明:以指定的区间读取文件内容
- 格式:
func GetBytesByTwoOffsets(reader io.ReaderAt, start int64, end int64) []byte
- 示例:
func ExampleGetBytesByTwoOffsets() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
f, _ := gfile.OpenWithFlagPerm(tempFile, os.O_RDONLY, gfile.DefaultPermOpen)
// GetBytesTilChar returns the contents of the file as []byte
// until the next specified byte `char` position.
char := gfile.GetBytesByTwoOffsets(f, 0, 3)
fmt.Println(char)
// Output:
// [103 111 102]
}
PutContents
- 说明:往指定路径文件添加字符串内容。如果文件不存在将会递归的形式自动创建。
- 格式:
func putContents(path string, data []byte, flag int, perm os.FileMode) error
- 示例:
func ExamplePutContents() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// It creates and puts content string into specifies file path.
// It automatically creates directory recursively if it does not exist.
gfile.PutContents(tempFile, "goframe example content")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example content
}
PutBytes
- 说明:以字节形式写入指定文件,如果文件不存在将会递归的形式自动创建
- 格式:
func PutBytes(path string, content []byte) error
- 示例:
func ExamplePutBytes() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutBytes(tempFile, []byte("goframe example content"))
// read contents
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example content
}
PutContentsAppend
- 说明:追加字符串内容到指定文件,如果文件不存在将会递归的形式自动创建。
- 格式:
func PutContentsAppend(path string, content string) error
- 示例:
func ExamplePutContentsAppend() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// It creates and append content string into specifies file path.
// It automatically creates directory recursively if it does not exist.
gfile.PutContentsAppend(tempFile, " append content")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example content
// goframe example content append content
}
PutBytesAppend
- 说明:追加字节内容到指定文件。如果文件不存在将会递归的形式自动创建。
- 格式:
func PutBytesAppend(path string, content []byte) error
- 示例:
func ExamplePutBytesAppend() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// write contents
gfile.PutBytesAppend(tempFile, []byte(" append"))
// read contents
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example content
// goframe example content append
}
GetNextCharOffset
- 说明:从某个偏移量开始,获取文件中指定字符所在下标
- 格式:
func GetNextCharOffset(reader io.ReaderAt, char byte, start int64) int64
- 示例:
func ExampleGetNextCharOffset() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
f, err := gfile.OpenWithFlagPerm(tempFile, os.O_RDONLY, DefaultPermOpen)
defer f.Close()
// read contents
index := gfile.GetNextCharOffset(f, 'f', 0)
fmt.Println(index)
// Output:
// 2
}
GetNextCharOffsetByPath
- 说明:从某个偏移量开始,获取文件中指定字符所在下标
- 格式:
func GetNextCharOffsetByPath(path string, char byte, start int64) int64
- 示例:
func ExampleGetNextCharOffsetByPath() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// read contents
index := gfile.GetNextCharOffsetByPath(tempFile, 'f', 0)
fmt.Println(index)
// Output:
// 2
}
GetBytesTilCharByPath
- 说明:以某个字符定位截取指定长度的文件内容以字节形式返回
- 格式:
func GetBytesTilCharByPath(path string, char byte, start int64) ([]byte, int64)
- 示例:
func ExampleGetBytesTilCharByPath() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// read contents
fmt.Println(gfile.GetBytesTilCharByPath(tempFile, 'f', 0))
// Output:
// [103 111 102] 2
}
GetBytesByTwoOffsetsByPath
- 说明:用两个偏移量截取指定文件的内容以字节形式返回
- 格式:
func GetBytesByTwoOffsetsByPath(path string, start int64, end int64) []byte
- 示例:
func ExampleGetBytesByTwoOffsetsByPath() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// read contents
fmt.Println(gfile.GetBytesByTwoOffsetsByPath(tempFile, 0, 7))
// Output:
// [103 111 102 114 97 109 101]
}
ReadLines
- 说明:以字符串形式逐行读取文件内容
- 格式:
func ReadLines(file string, callback func(text string) error) error
- 示例:
func ExampleReadLines() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "L1 goframe example content\nL2 goframe example content")
// read contents
gfile.ReadLines(tempFile, func(text string) error {
// Process each line
fmt.Println(text)
return nil
})
// Output:
// L1 goframe example content
// L2 goframe example content
}
ReadLinesBytes
- 说明:以字节形式逐行读取文件内容
- 格式:
func ReadLinesBytes(file string, callback func(bytes []byte) error) error
- 示例:
func ExampleReadLinesBytes() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_content")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "L1 goframe example content\nL2 goframe example content")
// read contents
gfile.ReadLinesBytes(tempFile, func(bytes []byte) error {
// Process each line
fmt.Println(bytes)
return nil
})
// Output:
// [76 49 32 103 111 102 114 97 109 101 32 101 120 97 109 112 108 101 32 99 111 110 116 101 110 116]
// [76 50 32 103 111 102 114 97 109 101 32 101 120 97 109 112 108 101 32 99 111 110 116 101 110 116]
}
Truncate
- 说明:裁剪文件为指定大小
- 注意:如果给定文件路径是软链,将会修改源文件
- 格式:
func Truncate(path string, size int) error
- 示例:
func ExampleTruncate(){
// init
var (
path = gfile.Join(gfile.TempDir("gfile_example_basic_dir"), "file1")
)
// Check whether the `path` size
stat, _ := gfile.Stat(path)
fmt.Println(stat.Size())
// Truncate file
gfile.Truncate(path, 0)
// Check whether the `path` size
stat, _ = gfile.Stat(path)
fmt.Println(stat.Size())
// Output:
// 13
// 0
}
内容替换
ReplaceFile
- 说明:替换指定文件的指定内容为新内容
- 格式:
func ReplaceFile(search, replace, path string) error
- 示例:
func ExampleReplaceFile() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_replace")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// It replaces content directly by file path.
gfile.ReplaceFile("content", "replace word", tempFile)
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example content
// goframe example replace word
}
ReplaceFileFunc
- 说明:使用自定义函数替换指定文件内容
- 格式:
func ReplaceFileFunc(f func(path, content string) string, path string) error
- 示例:
func ExampleReplaceFileFunc() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_replace")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example 123")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// It replaces content directly by file path and callback function.
gfile.ReplaceFileFunc(func(path, content string) string {
// Replace with regular match
reg, _ := regexp.Compile(`\d{3}`)
return reg.ReplaceAllString(content, "[num]")
}, tempFile)
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example 123
// goframe example [num]
}
ReplaceDir
- 说明:扫描指定目录,替换符合条件的文件的指定内容为新内容
- 格式:
func ReplaceDir(search, replace, path, pattern string, recursive ...bool) error
- 示例:
func ExampleReplaceDir() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_replace")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example content")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// It replaces content of all files under specified directory recursively.
gfile.ReplaceDir("content", "replace word", tempDir, "gfile_example.txt", true)
// read contents
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example content
// goframe example replace word
}
ReplaceDirFunc
- 说明:扫描指定目录,使用自定义函数替换符合条件的文件的指定内容为新内容
- 格式:
func ReplaceDirFunc(f func(path, content string) string, path, pattern string, recursive ...bool) error
- 示例:
func ExampleReplaceDirFunc() {
// init
var (
fileName = "gfile_example.txt"
tempDir = gfile.TempDir("gfile_example_replace")
tempFile = gfile.Join(tempDir, fileName)
)
// write contents
gfile.PutContents(tempFile, "goframe example 123")
// read contents
fmt.Println(gfile.GetContents(tempFile))
// It replaces content of all files under specified directory with custom callback function recursively.
gfile.ReplaceDirFunc(func(path, content string) string {
// Replace with regular match
reg, _ := regexp.Compile(`\d{3}`)
return reg.ReplaceAllString(content, "[num]")
}, tempDir, "gfile_example.txt", true)
fmt.Println(gfile.GetContents(tempFile))
// Output:
// goframe example 123
// goframe example [num]
}
文件时间
MTime
- 说明:获取路径修改时间
- 格式:
func MTime(path string) time.Time
- 示例:
func ExampleMTime() {
t := gfile.MTime(gfile.TempDir())
fmt.Println(t)
// May Output:
// 2021-11-02 15:18:43.901141 +0800 CST
}