-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
91 lines (80 loc) · 2.24 KB
/
main.go
File metadata and controls
91 lines (80 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
"sort"
)
func getFilesLen(files []os.FileInfo, printFiles bool) (filesNum int) {
if printFiles == true {
filesNum = len(files)
} else {
filesNum = 0
for _, f := range files {
if f.IsDir() {
filesNum++
}
}
}
return
}
func getSizeString(file os.FileInfo) (sizeString string) {
if size := file.Size(); size == 0 {
sizeString = " (empty)"
} else {
sizeString = fmt.Sprintf(" (%vb)", size)
}
return
}
func getDelimiters(index, filesNum int) (lastDelimiter, lastDelimiterDir string) {
lastDelimiter = "├───"
lastDelimiterDir = "│"
if index == filesNum {
lastDelimiter = "└───"
lastDelimiterDir = ""
}
return
}
func printFilesRecursive(out io.Writer, path string, printFiles bool, subPath string) error {
files, _ := ioutil.ReadDir(path)
sort.Slice(files, func(i, j int) bool {
return files[i].Name() < files[j].Name()
})
filesNum := getFilesLen(files, printFiles)
index := 1
for _, file := range files {
lastDelimiter, lastDelimiterDir := getDelimiters(index, filesNum)
if file.IsDir() && printFiles == false || printFiles == true {
index++
}
if !file.IsDir() && printFiles == true {
sizeString := getSizeString(file)
fmt.Fprint(out, subPath+lastDelimiter+file.Name()+sizeString+"\n")
}
if file.IsDir() {
fmt.Fprint(out, subPath+lastDelimiter+file.Name()+"\n")
printFilesRecursive(out, path+string(os.PathSeparator)+file.Name(), printFiles, subPath+lastDelimiterDir+"\t")
}
}
return nil
}
func dirTree(out io.Writer, path string, printFiles bool) error {
err := printFilesRecursive(out, path, printFiles, "")
if err != nil {
panic(err.Error())
}
return nil
}
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())
}
}