Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "io"
- "sort"
- "strings"
- //"io"
- "io/ioutil"
- "log"
- "os"
- //"path/filepath"
- //"strings"
- )
- func dirTree(out io.Writer, path string, printFiles bool) error {
- dirTreeLevel(out, make(map[int]bool), path, printFiles)
- return nil
- }
- func dirTreeLevel(out io.Writer, level map[int]bool, path string, printFiles bool) error {
- dirEntry, err := ioutil.ReadDir(path)
- if err != nil {
- log.Fatal(err)
- }
- delimiter := createDelimiter(level)
- var hasNext bool = true;
- //var idx int = -1;
- levelEntry := sortDir(dirEntry, !printFiles)
- var mapLevel = make(map[int]bool)
- for k,v := range level {
- mapLevel[k] = v
- }
- for idx, f := range levelEntry {
- var rune = "├"
- if (idx + 1 == len(levelEntry)) {
- rune = "└"
- hasNext = false
- }
- if (f.IsDir()) {
- fmt.Fprintf(out, "%s%s───%s\n", delimiter, rune, f.Name())
- }
- if (printFiles && !f.IsDir()) {
- size := fmt.Sprintf("%db", f.Size())
- if (f.Size() == 0) {
- size = "empty"
- }
- fmt.Fprintf(out, "%s%s───%s (%s)\n", delimiter, rune, f.Name(), size)
- }
- if (f.IsDir()) {
- mapLevel[len(level)] = hasNext;
- dirTreeLevel(out, mapLevel, path + "/" + f.Name(), printFiles)
- }
- }
- return nil
- }
- func createDelimiter(level map[int]bool) string {
- var delimiter string = ""
- //fmt.Printf("%v\n", level)
- for _, hasNext := range level {
- var levelDelimiter string = "#"
- if (hasNext == true) {
- levelDelimiter = "│"
- }
- delimiter = fmt.Sprintf("%s%s%s", delimiter, levelDelimiter, "\t")
- }
- return delimiter
- }
- func sortDir(dirEntry []os.FileInfo, dropFiles bool) (files []os.FileInfo) {
- for _,v := range dirEntry {
- if (v.IsDir()) {
- files = append(files, v)
- } else if (!dropFiles) {
- files = append(files, v)
- }
- }
- sort.Slice(files, func(i, j int) bool {
- var fnode = files[i]
- var snode = files[j]
- //if (fnode.IsDir() != snode.IsDir()) {
- // if (fnode.IsDir()) {
- // return true
- // } else {
- // return false
- // }
- //}
- return strings.ToLower(fnode.Name()) < strings.ToLower(snode.Name())
- })
- return files
- }
- func main() {
- out := os.Stdout
- if !(len(os.Args) == 2 || len(os.Args) == 3) {
- panic("usage go run main.go . [-f]")
- }
- path := os.Args[1]
- printFiles := len(os.Args) == 3 && os.Args[2] == "-f"
- err := dirTree(out, path, printFiles)
- if err != nil {
- panic(err.Error())
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement