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 }