util/file.go

182 lines
4.3 KiB
Go
Raw Normal View History

2022-05-14 13:45:51 +08:00
// Package util...
//
// Description : 文件相关工具
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-04-26 6:00 下午
package util
import (
"io/ioutil"
2023-02-07 17:29:29 +08:00
"net/http"
2022-05-14 13:45:51 +08:00
"os"
"strings"
2022-07-02 13:24:29 +08:00
"github.com/go-ini/ini"
2022-05-14 13:45:51 +08:00
"github.com/pkg/errors"
2022-06-26 16:11:30 +08:00
yml "gopkg.in/yaml.v3"
2022-05-14 13:45:51 +08:00
)
2022-05-14 14:27:40 +08:00
// file 文件相关操作
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 14:08 2022/5/14
type file struct {
}
2022-05-14 13:45:51 +08:00
// GetProjectPath 获取项目路径(可执行文件所在目录)
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:32 下午 2021/4/26
2022-05-14 14:27:40 +08:00
func (f *file) GetProjectPath() (string, error) {
2022-05-14 13:45:51 +08:00
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配置问价,并解析到指定的结构体中
2022-05-14 13:45:51 +08:00
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:35 下午 2021/4/26
func (f *file) ReadYmlContent(filePath string, result interface{}) error {
2022-05-14 13:45:51 +08:00
if nil == result {
return errors.New("接收读取结果的数据指针为NIL")
}
var (
fileContent []byte
err error
)
2022-05-14 14:27:40 +08:00
if fileContent, err = f.ReadFileContent(filePath); nil != err {
2022-05-14 13:45:51 +08:00
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)
}
2022-07-02 13:24:29 +08:00
// 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)
}
2022-07-02 13:18:40 +08:00
// 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
2022-07-02 13:24:29 +08:00
case "ini":
parseFunc = f.ReadIniContent
2022-07-02 13:18:40 +08:00
default:
return errors.New(fileExt + " 暂不支持当前格式的文件解析")
}
return parseFunc(filePath, receiver)
}
2022-05-14 13:45:51 +08:00
// ReadFileContent 读取文件内容
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:37 下午 2021/4/26
2022-05-14 14:27:40 +08:00
func (f *file) ReadFileContent(filePath string) ([]byte, error) {
if exist, isFile := f.IsFileExist(filePath); !exist || !isFile {
2022-05-14 13:45:51 +08:00
//文件不存在或者是一个目录
return nil, errors.New(filePath + " 文件不存在或者是一个目录!")
}
//打开文件
var (
2022-05-14 14:27:40 +08:00
fileHandler *os.File
err error
2022-05-14 13:45:51 +08:00
)
2022-05-14 14:27:40 +08:00
if fileHandler, err = os.Open(filePath); nil != err {
2022-05-14 13:45:51 +08:00
return nil, err
}
2022-05-14 14:27:40 +08:00
return ioutil.ReadAll(fileHandler)
2022-05-14 13:45:51 +08:00
}
// IsFileExist 判断文件是否存在
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:37 下午 2021/4/26
2022-05-14 14:27:40 +08:00
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()
2022-05-14 13:45:51 +08:00
}
2023-02-07 17:29:29 +08:00
// GetFileMIMEType 获取本地文件的MIME类型
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:15 2023/2/7
func (f *file) GetFileMIMEType(filePath string) (string, error) {
var (
err error
fileHandler *os.File
)
if fileHandler, err = os.Open(filePath); nil != err {
return "", err
}
// 只需要前 512 个字节就可以了
buffer := make([]byte, 512)
if _, err = fileHandler.Read(buffer); nil != err {
return "", err
}
contentType := http.DetectContentType(buffer)
return contentType, nil
}