main.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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, "..", false)
  12. // foo("..", false)
  13. }
  14. func dirTree(output io.Writer, currDir string, printFile bool) error {
  15. recursionDirTree(currDir, false)
  16. return nil
  17. }
  18. func foo(prependingString string, output io.Writer, dir string, print bool) {
  19. fileObj, err := os.Open(dir)
  20. defer fileObj.Close()
  21. if err != nil {
  22. log.Fatalf("Could not open %s: %s", dir, err.Error())
  23. }
  24. // files - слайс fs.DirEntry
  25. // os.ReadDir возвращает отсортированный слайс DirEntry
  26. files, err := os.ReadDir(fileObj.Name())
  27. if err != nil {
  28. log.Fatalf("Could not read dir names in %s: %s", dir, err.Error())
  29. }
  30. var filesMap map[string]os.DirEntry = map[string]os.DirEntry{}
  31. var sortedFilesNameArr []string = []string{}
  32. for _, file := range files {
  33. sortedFilesNameArr = append(sortedFilesNameArr, file.Name())
  34. filesMap[file.Name()] = file
  35. }
  36. var newFileList []os.DirEntry = []os.DirEntry{}
  37. var length int
  38. // Печатаем только папки
  39. if !print {
  40. for _, file := range files {
  41. if file.IsDir() {
  42. newFileList = append(newFileList, file)
  43. }
  44. }
  45. files = newFileList
  46. }
  47. length = len(files)
  48. for i, file := range files {
  49. if file.IsDir() {
  50. var stringPrepender string
  51. if length > i+1 {
  52. fmt.Fprintf(output, prependingString+"├───"+"%s\n", file.Name())
  53. stringPrepender = prependingString + "│\t"
  54. } else {
  55. fmt.Fprintf(output, prependingString+"└───"+"%s\n", file.Name())
  56. stringPrepender = prependingString + "\t"
  57. }
  58. newDir := filepath.Join(dir, file.Name())
  59. fmt.Println("newDir", newDir, stringPrepender)
  60. }
  61. }
  62. /*
  63. fmt.Println(sortedFilesNameArr)
  64. fmt.Println(filesMap)
  65. fmt.Println(files)
  66. */
  67. }
  68. // todo Разобраться с log, err.Error
  69. func recursionDirTree(currDir string, printFiles bool) {
  70. fileObj, err := os.Open(currDir)
  71. defer fileObj.Close()
  72. if err != nil {
  73. log.Fatalf("Could not open %s: %s", currDir, err.Error())
  74. }
  75. files, err := os.ReadDir(fileObj.Name())
  76. if err != nil {
  77. log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error())
  78. }
  79. // os.ReadDir возвращает отсортированный слайс DirEntry
  80. var sortedFilesNameArr []string = []string{}
  81. var filesMap map[string]os.DirEntry = map[string]os.DirEntry{}
  82. for _, file := range files {
  83. sortedFilesNameArr = append(sortedFilesNameArr, file.Name())
  84. filesMap[file.Name()] = file
  85. }
  86. // Превращаем слайс всех объектов (файлов и папок) в слайс только папок
  87. // если printFiles == false
  88. var dirList []os.DirEntry = []os.DirEntry{}
  89. if !printFiles {
  90. for _, file := range files {
  91. if file.IsDir() {
  92. dirList = append(dirList, file)
  93. }
  94. }
  95. files = dirList
  96. }
  97. var length int = len(files)
  98. fmt.Println(length)
  99. // for i, file := range files{}
  100. // fmt.Println(files)
  101. // fmt.Println(unSortedFilesNameArr)
  102. // fmt.Println(sortedFilesArr)
  103. // fmt.Printf("%T\n", files[0])
  104. // fmt.Println(files)
  105. }