util/file.go

155 lines
2.8 KiB
Go
Raw Permalink Normal View History

2024-01-19 10:56:19 +08:00
package util
2024-01-23 21:12:04 +08:00
import (
2024-01-26 23:08:25 +08:00
"errors"
"io/fs"
2024-01-23 23:02:08 +08:00
"os"
2024-02-19 16:46:42 +08:00
"path"
2024-01-23 23:02:08 +08:00
"path/filepath"
2024-01-30 23:32:31 +08:00
"time"
2024-01-23 21:12:04 +08:00
)
2024-01-19 10:56:19 +08:00
const (
2024-01-26 23:08:25 +08:00
fileStatNotExist = iota
fileStatIsDir
fileStatIsFile
fileStatDenied
fileStatError
2024-01-19 10:56:19 +08:00
)
2024-01-25 02:47:42 +08:00
type FileStatModel struct {
stat int
}
func (f *FileStatModel) IsFile() bool {
return f.stat == fileStatIsFile
}
func (f *FileStatModel) NotFile() bool {
return f.stat != fileStatIsFile
}
func (f *FileStatModel) IsDir() bool {
return f.stat == fileStatIsDir
}
func (f *FileStatModel) NotDir() bool {
return f.stat != fileStatIsDir
}
func (f *FileStatModel) IsExist() bool {
return f.stat != fileStatNotExist
}
func (f *FileStatModel) NotExist() bool {
return f.stat == fileStatNotExist
}
2024-01-26 23:08:25 +08:00
func (f *FileStatModel) IsDenied() bool {
return f.stat == fileStatDenied
}
func (f *FileStatModel) NotDenied() bool {
return f.stat != fileStatDenied
}
func (f *FileStatModel) IsError() bool {
return f.stat == fileStatError
}
func (f *FileStatModel) NotError() bool {
return f.stat != fileStatError
}
2024-01-25 02:47:42 +08:00
func FileStat(filename string) *FileStatModel {
2024-01-23 23:02:08 +08:00
info, err := os.Stat(filepath.Clean(filename))
2024-01-26 23:08:25 +08:00
if errors.Is(err, fs.ErrNotExist) {
2024-01-25 02:47:42 +08:00
return &FileStatModel{stat: fileStatNotExist}
2024-01-23 23:02:08 +08:00
}
2024-01-26 23:08:25 +08:00
if errors.Is(err, fs.ErrPermission) {
return &FileStatModel{stat: fileStatDenied}
}
if err != nil {
return &FileStatModel{stat: fileStatError}
}
2024-01-23 23:02:08 +08:00
if info.IsDir() {
2024-01-25 02:47:42 +08:00
return &FileStatModel{stat: fileStatIsDir}
2024-01-23 23:02:08 +08:00
} else {
2024-01-25 02:47:42 +08:00
return &FileStatModel{stat: fileStatIsFile}
2024-01-23 23:02:08 +08:00
}
2024-01-19 10:56:19 +08:00
}
2024-01-30 23:32:31 +08:00
type DirListModel struct {
Files []DirListUnitModel
Dirs []DirListUnitModel
Error error
}
type DirListUnitModel struct {
Name string
Size int64
Mode fs.FileMode
ModTime time.Time
}
func NewDirListUnit(name string, size int64, mode fs.FileMode, modeTime time.Time) DirListUnitModel {
return DirListUnitModel{
Name: name,
Size: size,
Mode: mode,
ModTime: modeTime,
}
}
func DirList(p string) *DirListModel {
ls := &DirListModel{Error: nil}
2024-01-30 23:47:53 +08:00
dir, err := os.Open(filepath.Clean(p))
2024-01-30 23:32:31 +08:00
if err != nil {
ls.Error = err
return ls
}
defer func() {
_ = dir.Close()
}()
dirs, err := dir.Readdir(-1)
if err != nil {
ls.Error = err
return ls
}
for _, v := range dirs {
if v.IsDir() {
ls.Dirs = append(ls.Dirs, NewDirListUnit(v.Name(), v.Size(), v.Mode(), v.ModTime()))
} else {
ls.Files = append(ls.Files, NewDirListUnit(v.Name(), v.Size(), v.Mode(), v.ModTime()))
}
}
return ls
}
2024-02-19 16:46:42 +08:00
func MkdirP(p string, perm ...os.FileMode) error {
p = path.Clean(p)
if FileStat(p).NotExist() {
if len(perm) > 0 {
return os.MkdirAll(p, perm[0])
} else {
2024-02-19 16:49:50 +08:00
return os.MkdirAll(p, 0750)
2024-02-19 16:46:42 +08:00
}
}
return nil
}
func DirSize(p string) (int64, error) {
var size int64
p = path.Clean(p)
err := filepath.Walk(p, func(_ string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
size += info.Size()
}
return err
})
return size, err
}