goProject/trunk/goutil/fileUtil/bigFile.go

201 lines
5.1 KiB
Go
Raw Normal View History

2025-01-06 16:01:02 +08:00
package fileUtil
import (
"fmt"
"os"
"path/filepath"
"time"
"goutil/timeUtil"
)
// 大文件对象,可用于连续写入内容而不关闭文件,直到达到指定的大小
type BigFile struct {
// 文件夹名称
path string
// 当前文件名称
fileName string
// 文件名称前缀
fileNamePrefix string
// 当前文件大小单位Byte
fileSize int
// 最大的文件大小单位Byte
maxFileSize int
// 文件对象
file *os.File
// 获得新文件名称的方法
newFileNameFunc func(string, string) string
}
// 获取文件的完整路径
func (this *BigFile) getFullPath() string {
return filepath.Join(this.path, this.fileName)
}
// 初始化文件对象
func (this *BigFile) initFile() error {
// 初始化文件名称
this.fileName = this.newFileNameFunc(this.fileNamePrefix, this.fileName)
// 初始化文件大小
this.fileSize = 0
// 打开文件
file, err := os.OpenFile(this.getFullPath(), os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm|os.ModeTemporary)
if err != nil {
return fmt.Errorf("打开文件%s错误错误信息为%s", this.getFullPath(), err)
} else {
this.file = file
}
return nil
}
// 返回当前文件名称
// 返回值:
// 当前文件名称
func (this *BigFile) FileName() string {
return this.fileName
}
// 保存消息
// message消息内容
// 返回值:错误对象
func (this *BigFile) SaveMessage(message string) error {
if this.file == nil {
return fmt.Errorf("文件对象为空path:%s", this.getFullPath())
}
// 增加文件大小
this.fileSize += len([]byte(message))
// 写入消息(在结尾处增加一个换行符\n
message = fmt.Sprintf("%s\n", message)
if _, err := this.file.WriteString(message); err != nil {
return fmt.Errorf("向文件%s写入信息错误错误信息为%s", this.getFullPath(), err)
}
// 如果达到了文件的上限,则关闭文件并重新打开一个新文件
if this.fileSize >= this.maxFileSize {
this.Close()
this.initFile()
}
return nil
}
// 写入字节消息
// message消息内容
// 返回值:错误对象
func (this *BigFile) WriteMessage(message []byte) error {
if this.file == nil {
return fmt.Errorf("文件对象为空path:%s", this.getFullPath())
}
// 增加文件大小
this.fileSize += len(message)
// 写入消息
if _, err := this.file.Write(message); err != nil {
return fmt.Errorf("向文件%s写入信息错误错误信息为%s", this.getFullPath(), err)
}
// 如果达到了文件的上限,则关闭文件并重新打开一个新文件
if this.fileSize >= this.maxFileSize {
this.Close()
this.initFile()
}
return nil
}
// 关闭对象
// 返回值:无
func (this *BigFile) Close() {
if this.file != nil {
this.file.Close()
this.file = nil
}
}
// 创建新的大文件对象(obsolete)
// _path:文件夹路径
// _maxFileSize:单个文件大小的最大值单位Byte
// 返回值:
// 大文件对象
// 错误对象
func NewBigFile(_path string, _maxFileSize int) (*BigFile, error) {
return NewBigFileWithNewFileNameFunc(_path, "default", _maxFileSize, newFileName)
}
// 创建新的大文件对象
// _path:文件夹路径
// _fileNamePrefix:文件名称前缀
// _maxFileSize:单个文件大小的最大值单位Byte
// 返回值:
// 大文件对象
// 错误对象
func NewBigFile2(_path, _fileNamePrefix string, _maxFileSize int) (*BigFile, error) {
return NewBigFileWithNewFileNameFunc(_path, _fileNamePrefix, _maxFileSize, newFileName)
}
// 创建新的大文件对象
// _path:文件夹路径
// _fileNamePrefix:文件名称前缀
// _maxFileSize:单个文件大小的最大值单位Byte
// _newFileNameFunc:创建新文件名称的方法
// 返回值:
// 大文件对象
// 错误对象
func NewBigFileWithNewFileNameFunc(_path, _fileNamePrefix string, _maxFileSize int, _newFileNameFunc func(string, string) string) (*BigFile, error) {
return NewBigFileWithNewFileNameFunc2(_path, _fileNamePrefix, "default", _maxFileSize, _newFileNameFunc)
}
// 创建新的大文件对象
// _path:文件夹路径
// _fileNamePrefix:文件名称前缀
// _fileName:文件名称
// _maxFileSize:单个文件大小的最大值单位Byte
// _newFileNameFunc:创建新文件名称的方法
// 返回值:
// 大文件对象
// 错误对象
func NewBigFileWithNewFileNameFunc2(_path, _fileNamePrefix, _fileName string, _maxFileSize int, _newFileNameFunc func(string, string) string) (*BigFile, error) {
// 判断文件夹是否存在,如果不存在则创建
if !IsDirExists(_path) {
os.MkdirAll(_path, os.ModePerm|os.ModeTemporary)
}
// 初始化对象
obj := &BigFile{
path: _path,
fileNamePrefix: _fileNamePrefix,
fileName: _fileName,
maxFileSize: _maxFileSize,
newFileNameFunc: _newFileNameFunc,
}
// 初始化文件对象
if err := obj.initFile(); err != nil {
obj.Close()
return nil, err
}
return obj, nil
}
// 创建新的文件名称
// prefix:前缀
// currFileName:当前文件名称
// 返回值:
// 新的文件名称
func newFileName(prefix, currFileName string) string {
return fmt.Sprintf("%s_%s.data", prefix, timeUtil.Format(time.Now(), "yyyyMMddHHmmss"))
}