// Package util... // // Description : 文件相关工具 // // Author : go_developer@163.com<白茶清欢> // // Date : 2021-04-26 6:00 下午 package util import ( "io/ioutil" "os" "strings" "github.com/go-ini/ini" "github.com/pkg/errors" yml "gopkg.in/yaml.v3" ) // file 文件相关操作 // // Author : go_developer@163.com<白茶清欢> // // Date : 14:08 2022/5/14 type file struct { } // GetProjectPath 获取项目路径(可执行文件所在目录) // // Author : go_developer@163.com<白茶清欢> // // Date : 10:32 下午 2021/4/26 func (f *file) GetProjectPath() (string, error) { rootPath, err := os.Getwd() if nil != err { return "", err } pathArr := strings.Split(rootPath, "/") if len(pathArr) > 0 { if pathArr[len(pathArr)-1] == "test" { rootPath = strings.Join(pathArr[0:len(pathArr)-1], "/") } } return rootPath, nil } // ReadYmlContent 读取yml配置问价,并解析到指定的结构体中 // // Author : go_developer@163.com<白茶清欢> // // Date : 10:35 下午 2021/4/26 func (f *file) ReadYmlContent(filePath string, result interface{}) error { if nil == result { return errors.New("接收读取结果的数据指针为NIL") } var ( fileContent []byte err error ) if fileContent, err = f.ReadFileContent(filePath); nil != err { return err } return yml.Unmarshal(fileContent, result) } // ReadJSONContent 读取JSON内容,并解析到指定的结构体中 // // Author : go_developer@163.com<白茶清欢> // // Date : 15:23 2022/6/9 func (f *file) ReadJSONContent(filePath string, result interface{}) error { if nil == result { return errors.New("接收读取结果的数据指针为NIL") } var ( fileContent []byte err error ) if fileContent, err = f.ReadFileContent(filePath); nil != err { return err } return JSON.UnmarshalWithNumber(fileContent, result) } // ReadIniContent 读取并解析ini文件 // // Author : go_developer@163.com<白茶清欢> // // Date : 13:21 2022/7/2 func (f *file) ReadIniContent(filePath string, result interface{}) error { if nil == result { return errors.New("接收读取结果的数据指针为NIL") } return ini.MapTo(result, filePath) } // ReadAnyFileContent 读取任意类型的文件并解析 // // Author : go_developer@163.com<白茶清欢> // // Date : 13:11 2022/7/2 func (f *file) ReadAnyFileContent(filePath string, receiver interface{}) error { fileInfoArr := strings.Split(filePath, ".") if len(fileInfoArr) < 2 { return errors.New("未知的文件类型") } var ( parseFunc func(filePath string, receiver interface{}) error ) fileExt := strings.ToLower(fileInfoArr[len(fileInfoArr)-1]) switch fileExt { case "json": parseFunc = f.ReadJSONContent case "yml": fallthrough case "yaml": parseFunc = f.ReadYmlContent case "ini": parseFunc = f.ReadIniContent default: return errors.New(fileExt + " 暂不支持当前格式的文件解析") } return parseFunc(filePath, receiver) } // ReadFileContent 读取文件内容 // // Author : go_developer@163.com<白茶清欢> // // Date : 10:37 下午 2021/4/26 func (f *file) ReadFileContent(filePath string) ([]byte, error) { if exist, isFile := f.IsFileExist(filePath); !exist || !isFile { //文件不存在或者是一个目录 return nil, errors.New(filePath + " 文件不存在或者是一个目录!") } //打开文件 var ( fileHandler *os.File err error ) if fileHandler, err = os.Open(filePath); nil != err { return nil, err } return ioutil.ReadAll(fileHandler) } // IsFileExist 判断文件是否存在 // // Author : go_developer@163.com<白茶清欢> // // Date : 10:37 下午 2021/4/26 func (f *file) IsFileExist(filePath string) (bool, bool) { fileStat, err := os.Stat(filePath) return nil == err || os.IsExist(err), (nil == err || os.IsExist(err)) && !fileStat.IsDir() }