-func walk(root string) ([]File, uint64, error) {
- fd, err := os.Open(root)
- if err != nil {
- return nil, 0, err
- }
- var files []File
- var size uint64
- var info fs.FileInfo
- for {
- ents, err := fd.ReadDir(1 << 10)
- if err != nil {
- if err == io.EOF {
- break
- }
- fd.Close()
- return nil, 0, err
- }
- for _, ent := range ents {
- file := File{Name: ent.Name()}
- fullPath := path.Join(root, file.Name)
- if ent.IsDir() {
- file.Name += "/"
- }
- info, err = ent.Info()
- if err != nil {
- log.Println("can not stat:", fullPath, ":", err)
- files = append(files, file)
- continue
- }
- file.Mtime = info.ModTime().Unix()
- if ent.IsDir() {
- file.Files, file.Size, err = walk(fullPath)
- if err != nil {
- log.Println("can not walk:", fullPath, ":", err)
- files = append(files, file)
- continue
- }
- } else if info.Mode().IsRegular() {
- file.Size = uint64(info.Size())
- }
- files = append(files, file)
- size += file.Size
- }
- }
- fd.Close()
- sort.Sort(ByName(files))
- return files, size, nil