Files
rdu/scan.go
tom.chivert 8efc6d8c6d
build / build (push) Successful in 32s
slightly optimized cpu usage
2024-08-20 19:41:00 +02:00

113 lines
1.9 KiB
Go

package main
import (
"fmt"
"os"
"path/filepath"
"syscall"
)
func getExts(exts []Ext, path string, size int64) []Ext {
ext := filepath.Ext(path)
if ext == "" {
ext = "none"
}
for i := 0; i < len(exts); i++ {
if exts[i].ext == ext {
exts[i].size += size
exts[i].count++
return exts
}
}
exts = append(exts, Ext{ext: ext, size: size, count: 1})
return exts
}
func getFiles(d Dir) ([]File, error) {
f, err := os.ReadDir(d.path)
if err != nil {
printerr(err)
return nil, err
}
var files []File
for _, file := range f {
if exclude(filepath.Join(d.path, file.Name())) {
continue
}
if !file.IsDir() {
files = append(files, File{name: file.Name(), prev: &d, size: getSize(filepath.Join(d.path, file.Name()))})
}
}
return files, nil
}
func getItems(d Dir) []Item {
var items []Item
for _, dir := range d.dirs {
items = append(items, Item{isDir: true, dir: &dir})
}
files, err := getFiles(d)
if err != nil {
printerr(err)
return nil
}
for _, file := range files {
items = append(items, Item{isDir: false, file: &file})
}
return items
}
func getPos(p string, items []Item) int {
for i, item := range items {
if item.isDir {
if item.dir.path == p {
return i
}
}
}
return 0
}
func getSize(path string) int64 {
file, err := os.Open(path)
if err != nil {
printerr(err)
return 0
}
defer file.Close()
info, err := file.Stat()
if err != nil {
printerr(err)
return 0
}
return info.Size()
}
func getDirMount(dir string) {
err := syscall.Statfs(dir, &config.dirMount)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func (d Dir) recurse() []Item {
var items []Item
for _, dir := range d.dirs {
items = append(items, Item{isDir: true, dir: &dir})
items = append(items, dir.recurse()...)
}
files, err := getFiles(d)
if err != nil {
printerr(err)
return nil
}
for _, file := range files {
items = append(items, Item{isDir: false, file: &file})
}
return items
}