budget-go/file/manager.go

135 lines
2.5 KiB
Go

package file
import (
"crypto/sha256"
"fmt"
"math"
"math/big"
"os"
"github.com/gabriel-vasile/mimetype"
)
type File struct {
Id string `json:"id"`
Name string `json:"name"`
Path string `json:"path"`
Size int64 `json:"size"`
Type string `json:"type"`
Extension string `json:"extension"`
}
type Directory struct {
Id string `json:"id"`
Name string `json:"name"`
Path string `json:"path"`
}
type Tree struct {
Id string `json:"id"`
Name string `json:"name"`
Directories []Tree `json:"directories"`
Path string `json:"path"`
Files []File `json:"files"`
IsRoot bool `json:"is_root"`
}
func getFileId(path string) string {
hash := sha256.New()
hash.Write([]byte(path))
hashBytes := hash.Sum(nil)
bInt := new(big.Int).SetBytes(hashBytes)
return fmt.Sprintf("%d", int(math.Abs(float64(bInt.Int64()))))
}
func GetTree(name, path string) Tree {
tree := Tree{
Id: getFileId(path),
Name: name,
Directories: []Tree{},
Path: path,
Files: []File{},
IsRoot: name == "",
}
entries, err := os.ReadDir(path)
if err != nil {
return tree
}
for _, e := range entries {
if e.IsDir() {
tree.Directories = append(tree.Directories, GetTree(e.Name(), path+"/"+e.Name()))
} else {
p := path + "/" + e.Name()
fi, _ := os.Stat(p)
mtype, _ := mimetype.DetectFile(p)
tree.Files = append(tree.Files, File{
Id: getFileId(p),
Name: e.Name(),
Path: p,
Size: fi.Size(),
Type: mtype.String(),
Extension: mtype.Extension(),
})
}
}
return tree
}
func GetFiles(files *[]File, path string) *[]File {
entries, err := os.ReadDir(path)
if err != nil {
return files
}
for _, e := range entries {
p := path + "/" + e.Name()
if e.IsDir() {
GetFiles(files, p)
} else {
fi, _ := os.Stat(p)
mtype, _ := mimetype.DetectFile(p)
*files = append(*files, File{
Id: getFileId(p),
Name: e.Name(),
Path: p,
Size: fi.Size(),
Type: mtype.String(),
Extension: mtype.Extension(),
})
}
}
return files
}
func GetDirectories(files *[]Directory, path string) *[]Directory {
entries, err := os.ReadDir(path)
if err != nil {
return files
}
for _, e := range entries {
p := path + "/" + e.Name()
if e.IsDir() {
*files = append(*files, Directory{
Id: getFileId(p),
Name: e.Name(),
Path: p,
})
GetDirectories(files, p)
}
}
return files
}