1
0
dwelling-files/pkg/files/files.go

74 lines
1.5 KiB
Go

package files
import (
"net/url"
"os"
"path/filepath"
"time"
)
const FileDateFormat = "2006-01-02 15:04:05 MST"
type DirStat struct {
Files int64
FilesSize string
Directories int64
}
type DirEntry struct {
Name string
Link string
Datetime time.Time
Size string
}
func ScanDirectory(path, urlBase string) (entries []DirEntry, stats DirStat, err error) {
dir, err := os.ReadDir(path)
if err != nil {
return
}
var dirEntries []DirEntry = make([]DirEntry, 0)
var fileEntries []DirEntry = make([]DirEntry, 0)
var totalFilesSize int64 = 0
for _, ent := range dir {
entry, _ := ent.Info()
var isDirLink bool
if entry.Mode().Type()&os.ModeSymlink != 0 {
if slp, err := filepath.EvalSymlinks(filepath.Join(path, entry.Name())); err == nil {
lStat, _ := os.Lstat(slp)
isDirLink = lStat.IsDir()
}
}
if entry.IsDir() || isDirLink {
dirEntries = append(dirEntries, DirEntry{
Name: entry.Name(),
Link: url.PathEscape(entry.Name()) + "/",
Datetime: entry.ModTime(),
Size: "DIR",
})
stats.Directories++
} else {
fileEntries = append(fileEntries, DirEntry{
Name: entry.Name(),
Link: "/file" + urlBase + url.PathEscape(entry.Name()),
Datetime: entry.ModTime(),
Size: convertFileSize(entry.Size()),
})
totalFilesSize += entry.Size()
stats.Files++
}
}
stats.FilesSize = convertFileSize(totalFilesSize)
entries = append(entries, dirEntries...)
entries = append(entries, fileEntries...)
return
}