Advertisement
Guest User

Untitled

a guest
Mar 16th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.39 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "io"
  6.     "sort"
  7.     "strings"
  8.  
  9.     //"io"
  10.     "io/ioutil"
  11.     "log"
  12.     "os"
  13.     //"path/filepath"
  14.     //"strings"
  15. )
  16.  
  17. func dirTree(out io.Writer, path string, printFiles bool) error  {
  18.     dirTreeLevel(out, make(map[int]bool), path, printFiles)
  19.     return nil
  20. }
  21.  
  22.  
  23. func dirTreeLevel(out io.Writer, level map[int]bool, path string, printFiles bool) error  {
  24.     dirEntry, err := ioutil.ReadDir(path)
  25.     if err != nil {
  26.         log.Fatal(err)
  27.     }
  28.     delimiter := createDelimiter(level)
  29.     var hasNext bool = true;
  30.     //var idx int = -1;
  31.     levelEntry := sortDir(dirEntry, !printFiles)
  32.     var mapLevel = make(map[int]bool)
  33.     for k,v := range level {
  34.         mapLevel[k] = v
  35.     }
  36.     for idx, f := range  levelEntry {
  37.         var rune = "├"
  38.         if (idx + 1 == len(levelEntry)) {
  39.             rune = "└"
  40.             hasNext = false
  41.         }
  42.         if (f.IsDir()) {
  43.             fmt.Fprintf(out, "%s%s───%s\n", delimiter, rune, f.Name())
  44.         }
  45.         if (printFiles && !f.IsDir()) {
  46.             size := fmt.Sprintf("%db", f.Size())
  47.             if (f.Size() == 0) {
  48.                 size = "empty"
  49.             }
  50.             fmt.Fprintf(out, "%s%s───%s (%s)\n", delimiter, rune, f.Name(), size)
  51.         }
  52.         if (f.IsDir()) {
  53.             mapLevel[len(level)] = hasNext;
  54.             dirTreeLevel(out, mapLevel, path + "/" + f.Name(), printFiles)
  55.         }
  56.     }
  57.  
  58.     return nil
  59. }
  60.  
  61. func createDelimiter(level map[int]bool) string  {
  62.     var delimiter string = ""
  63.     //fmt.Printf("%v\n", level)
  64.     for _, hasNext := range level {
  65.         var levelDelimiter string = "#"
  66.         if (hasNext == true) {
  67.             levelDelimiter = "│"
  68.         }
  69.         delimiter = fmt.Sprintf("%s%s%s", delimiter, levelDelimiter, "\t")
  70.     }
  71.     return delimiter
  72. }
  73.  
  74.  
  75. func sortDir(dirEntry []os.FileInfo, dropFiles bool) (files []os.FileInfo) {
  76.     for _,v := range dirEntry {
  77.         if (v.IsDir()) {
  78.             files = append(files, v)
  79.         } else if (!dropFiles) {
  80.             files = append(files, v)
  81.         }
  82.     }
  83.     sort.Slice(files, func(i, j int) bool {
  84.         var fnode = files[i]
  85.         var snode = files[j]
  86.         //if (fnode.IsDir() != snode.IsDir()) {
  87.         //  if (fnode.IsDir()) {
  88.         //      return true
  89.         //  } else {
  90.         //      return false
  91.         //  }
  92.         //}
  93.         return strings.ToLower(fnode.Name()) < strings.ToLower(snode.Name())
  94.     })
  95.     return files
  96. }
  97.  
  98.  
  99. func main() {
  100.     out := os.Stdout
  101.     if !(len(os.Args) == 2 || len(os.Args) == 3) {
  102.         panic("usage go run main.go . [-f]")
  103.     }
  104.     path := os.Args[1]
  105.     printFiles := len(os.Args) == 3 && os.Args[2] == "-f"
  106.     err := dirTree(out, path, printFiles)
  107.     if err != nil {
  108.         panic(err.Error())
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement