Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "io"
- "os"
- "sort"
- )
- 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())
- }
- }
- func dirTree(out io.Writer, path string, printFiles bool) error {
- return dirLevel(out, path, printFiles, "")
- }
- func dirLevel(out io.Writer, path string, printFiles bool, parentPrefix string) error {
- sep := string(os.PathSeparator)
- entries, err := ReadDir(path, !printFiles)
- if err != nil {
- return err
- }
- for i, entry := range entries {
- namePrefixSymbol := '├'
- if i == len(entries)-1 {
- namePrefixSymbol = '└'
- }
- printName := fmt.Sprintf("%s%c───%s", parentPrefix, namePrefixSymbol, entry.Name())
- if entry.IsDir() {
- out.Write([]byte(printName + "\n"))
- childLvlPrefix := "\t"
- if i < len(entries)-1 {
- childLvlPrefix = "│" + childLvlPrefix
- }
- dirLevel(out, path+sep+entry.Name(), printFiles, parentPrefix+childLvlPrefix)
- }
- if !entry.IsDir() && printFiles {
- inf, err := entry.Info()
- if err != nil {
- return err
- }
- if inf.Size() > 0 {
- printName = fmt.Sprintf("%s (%db)", printName, inf.Size())
- } else {
- printName = fmt.Sprintf("%s (empty)", printName)
- }
- out.Write([]byte(printName + "\n"))
- }
- }
- return nil
- }
- func ReadDir(name string, filesFirst bool) ([]os.DirEntry, error) {
- f, err := os.Open(name)
- if err != nil {
- return nil, err
- }
- defer f.Close()
- dirs, err := f.ReadDir(-1)
- sort.Slice(dirs, func(i, j int) bool {
- if filesFirst && !dirs[i].IsDir() {
- return true
- }
- if filesFirst && !dirs[j].IsDir() {
- return false
- }
- return dirs[i].Name() < dirs[j].Name()
- })
- return dirs, err
- }
Advertisement
Add Comment
Please, Sign In to add comment