isbasov

dirTree

Jan 14th, 2024
1,382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.87 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "io"
  6.     "os"
  7.     "sort"
  8. )
  9.  
  10. func main() {
  11.     out := os.Stdout
  12.     if !(len(os.Args) == 2 || len(os.Args) == 3) {
  13.         panic("usage go run main.go . [-f]")
  14.     }
  15.     path := os.Args[1]
  16.     printFiles := len(os.Args) == 3 && os.Args[2] == "-f"
  17.     err := dirTree(out, path, printFiles)
  18.     if err != nil {
  19.         panic(err.Error())
  20.     }
  21. }
  22.  
  23. func dirTree(out io.Writer, path string, printFiles bool) error {
  24.     return dirLevel(out, path, printFiles, "")
  25. }
  26.  
  27. func dirLevel(out io.Writer, path string, printFiles bool, parentPrefix string) error {
  28.     sep := string(os.PathSeparator)
  29.  
  30.     entries, err := ReadDir(path, !printFiles)
  31.     if err != nil {
  32.         return err
  33.     }
  34.     for i, entry := range entries {
  35.  
  36.         namePrefixSymbol := '├'
  37.         if i == len(entries)-1 {
  38.             namePrefixSymbol = '└'
  39.         }
  40.  
  41.         printName := fmt.Sprintf("%s%c───%s", parentPrefix, namePrefixSymbol, entry.Name())
  42.  
  43.         if entry.IsDir() {
  44.             out.Write([]byte(printName + "\n"))
  45.  
  46.             childLvlPrefix := "\t"
  47.             if i < len(entries)-1 {
  48.                 childLvlPrefix = "│" + childLvlPrefix
  49.             }
  50.             dirLevel(out, path+sep+entry.Name(), printFiles, parentPrefix+childLvlPrefix)
  51.         }
  52.  
  53.         if !entry.IsDir() && printFiles {
  54.             inf, err := entry.Info()
  55.             if err != nil {
  56.                 return err
  57.             }
  58.             if inf.Size() > 0 {
  59.                 printName = fmt.Sprintf("%s (%db)", printName, inf.Size())
  60.             } else {
  61.                 printName = fmt.Sprintf("%s (empty)", printName)
  62.             }
  63.             out.Write([]byte(printName + "\n"))
  64.         }
  65.     }
  66.  
  67.     return nil
  68. }
  69.  
  70. func ReadDir(name string, filesFirst bool) ([]os.DirEntry, error) {
  71.     f, err := os.Open(name)
  72.     if err != nil {
  73.         return nil, err
  74.     }
  75.     defer f.Close()
  76.  
  77.     dirs, err := f.ReadDir(-1)
  78.     sort.Slice(dirs, func(i, j int) bool {
  79.         if filesFirst && !dirs[i].IsDir() {
  80.             return true
  81.         }
  82.         if filesFirst && !dirs[j].IsDir() {
  83.             return false
  84.         }
  85.         return dirs[i].Name() < dirs[j].Name()
  86.     })
  87.     return dirs, err
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment