123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- package fileop
- import (
- "fmt"
- "math"
- "os"
- "path/filepath"
- "strings"
- "crazy-fox-backend-api/utils"
- "github.com/pkg/errors"
- )
- // FileMove 文件移动供外部调用
- // @param: src string, dst string(src: 源位置,绝对路径or相对路径, dst: 目标位置,绝对路径or相对路径,必须为文件夹)
- // @return: err error
- func FileMove(src string, dst string) (err error) {
- if dst == "" {
- return nil
- }
- src, err = filepath.Abs(src)
- if err != nil {
- return err
- }
- dst, err = filepath.Abs(dst)
- if err != nil {
- return err
- }
- revoke := false
- dir := filepath.Dir(dst)
- Redirect:
- _, err = os.Stat(dir)
- if err != nil {
- err = os.MkdirAll(dir, 0o755)
- if err != nil {
- return err
- }
- if !revoke {
- revoke = true
- goto Redirect
- }
- }
- return os.Rename(src, dst)
- }
- // FileDel 删除文件
- func FileDel(filePath string) error {
- return os.RemoveAll(filePath)
- }
- // FileExist 判断文件是否存在
- func FileExist(path string) bool {
- exist, err := Exist(path)
- if err != nil || !exist {
- return false
- }
- return IsFile(path)
- }
- // FileRename 文件重命名
- func FileRename(oldName, newName string) error {
- return os.Rename(oldName, newName)
- }
- // FileSizeFormat 格式化文件的大小
- func FileSizeFormat(s uint64) string {
- if s < 10 {
- return fmt.Sprintf("%d B", s)
- }
- sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"}
- e := math.Floor(utils.LogN(float64(s), 1024))
- suffix := sizes[int(e)]
- val := math.Floor(float64(s)/math.Pow(1024, e)*10+0.5) / 10
- return fmt.Sprintf(utils.Ternary(val < 10, "%.1f %s", "%.0f %s"), val, suffix)
- }
- // FileSave 保存文件
- func FileSave(data []byte, dirPath string, fileName string) error {
- if err := DirCreate(dirPath); err != nil {
- return errors.WithStack(err)
- }
- fileHandle, err := os.Create(filepath.Join(dirPath, fileName))
- if err != nil {
- return errors.WithStack(err)
- }
- defer fileHandle.Close()
- _, err = fileHandle.Write(data)
- if err != nil {
- return errors.WithStack(err)
- }
- return nil
- }
- // fileTypeName 文件类型名
- func fileTypeName(fileType string) string {
- switch fileType {
- case "d": // 目录文件
- return "文件夹"
- case "c": // 字符设备文件
- return "字符设备"
- case "b": // 块设备文件
- return "块设备"
- case "l": // 符号链接文件
- return "符号链接"
- case "s": // 套接字文件
- return "套接字文件"
- case "p": // 管道文件
- return "管道文件"
- case "?": // 未知文件
- return "未知文件"
- default: // 普通文件
- return strings.ToUpper(fileType) + " 文件"
- }
- }
- // FileType 文件类型
- func FileType(fileInfo os.FileInfo) string {
- fileType := fileInfo.Mode().String()[0:1]
- // 普通文件
- if fileType == "-" {
- split := strings.Split(fileInfo.Name(), ".")
- fileType = split[len(split)-1]
- if fileType == "" {
- fileType = "?"
- }
- }
- return strings.ToLower(fileType)
- }
- // IsFile 判断所给路径是否为文件
- func IsFile(path string) bool {
- return !IsDir(path)
- }
|