74 lines
1.5 KiB
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
|
|
}
|