main.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "log"
  6. "os"
  7. "path/filepath"
  8. )
  9. func main() {
  10. // dirTree(os.Stdout, "..", true)
  11. foo("", os.Stdout, "..", true)
  12. // sizeTest()
  13. }
  14. func sizeTest() {
  15. fileInfo, err := os.Stat("foo1.go")
  16. if err != nil {
  17. fmt.Println("!")
  18. }
  19. fmt.Println(fileInfo.Size(), err)
  20. }
  21. func dirTree(output io.Writer, currDir string, printFile bool) error {
  22. recursionDirTree(currDir, false)
  23. return nil
  24. }
  25. func foo(prependingString string, output io.Writer, dir string, print bool) {
  26. fileObj, err := os.Open(dir)
  27. defer fileObj.Close()
  28. if err != nil {
  29. log.Fatalf("Could not open %s: %s", dir, err.Error())
  30. }
  31. // files - слайс fs.DirEntry
  32. // os.ReadDir возвращает отсортированный слайс DirEntry
  33. files, err := os.ReadDir(fileObj.Name())
  34. if err != nil {
  35. log.Fatalf("Could not read dir names in %s: %s", dir, err.Error())
  36. }
  37. var filesMap map[string]os.DirEntry = map[string]os.DirEntry{}
  38. var sortedFilesNameArr []string = []string{}
  39. for _, file := range files {
  40. sortedFilesNameArr = append(sortedFilesNameArr, file.Name())
  41. filesMap[file.Name()] = file
  42. }
  43. var newFileList []os.DirEntry = []os.DirEntry{}
  44. var length int
  45. // Печатаем только папки
  46. if !print {
  47. for _, file := range files {
  48. if file.IsDir() {
  49. newFileList = append(newFileList, file)
  50. }
  51. }
  52. files = newFileList
  53. }
  54. length = len(files)
  55. for i, file := range files {
  56. if file.IsDir() {
  57. var stringPrepender string
  58. if length > i+1 {
  59. fmt.Fprintf(output, prependingString+"├───"+"%s\n", file.Name())
  60. stringPrepender = prependingString + "│\t"
  61. } else {
  62. fmt.Fprintf(output, prependingString+"└───"+"%s\n", file.Name())
  63. stringPrepender = prependingString + "\t"
  64. }
  65. newDir := filepath.Join(dir, file.Name())
  66. foo(stringPrepender, output, newDir, print)
  67. } else if print {
  68. fileInfo, err := file.Info()
  69. if err != nil {
  70. log.Fatalf("Could not get fileInfo for %s:", file.Name())
  71. }
  72. size := fileInfo.Size()
  73. if size > 0 {
  74. if length > i+1 {
  75. fmt.Fprintf(output, prependingString+"├───%s (%vb)\n", file.Name(), size)
  76. } else {
  77. fmt.Fprintf(output, prependingString+"└───%s (%vb)\n", file.Name(), size)
  78. }
  79. } else {
  80. if length > i+1 {
  81. fmt.Fprintf(output, prependingString+"├───%s (empty)\n", file.Name())
  82. } else {
  83. fmt.Fprintf(output, prependingString+"└───%s (empty)\n", file.Name())
  84. }
  85. }
  86. }
  87. }
  88. /*
  89. fmt.Println(sortedFilesNameArr)
  90. fmt.Println(filesMap)
  91. fmt.Println(files)
  92. */
  93. }
  94. // todo Разобраться с log, err.Error
  95. func recursionDirTree(currDir string, printFiles bool) {
  96. fileObj, err := os.Open(currDir)
  97. defer fileObj.Close()
  98. if err != nil {
  99. log.Fatalf("Could not open %s: %s", currDir, err.Error())
  100. }
  101. files, err := os.ReadDir(fileObj.Name())
  102. if err != nil {
  103. log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error())
  104. }
  105. // os.ReadDir возвращает отсортированный слайс DirEntry
  106. var sortedFilesNameArr []string = []string{}
  107. var filesMap map[string]os.DirEntry = map[string]os.DirEntry{}
  108. for _, file := range files {
  109. sortedFilesNameArr = append(sortedFilesNameArr, file.Name())
  110. filesMap[file.Name()] = file
  111. }
  112. // Превращаем слайс всех объектов (файлов и папок) в слайс только папок
  113. // если printFiles == false
  114. var dirList []os.DirEntry = []os.DirEntry{}
  115. if !printFiles {
  116. for _, file := range files {
  117. if file.IsDir() {
  118. dirList = append(dirList, file)
  119. }
  120. }
  121. files = dirList
  122. }
  123. var length int = len(files)
  124. fmt.Println(length)
  125. // for i, file := range files{}
  126. // fmt.Println(files)
  127. // fmt.Println(unSortedFilesNameArr)
  128. // fmt.Println(sortedFilesArr)
  129. // fmt.Printf("%T\n", files[0])
  130. // fmt.Println(files)
  131. }