foo1.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "io/ioutil"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. "sort"
  10. )
  11. func main() {
  12. dirTree(os.Stdout, "..", true)
  13. }
  14. func dirTree(output io.Writer, currDir string, printFiles bool) error {
  15. recursionPrintService("", output, currDir, printFiles)
  16. return nil
  17. }
  18. func recursionPrintService(prependingString string, output io.Writer, currDir string, printFiles bool) {
  19. fileObj, err := os.Open(currDir)
  20. defer fileObj.Close()
  21. if err != nil {
  22. log.Fatalf("Could not open %s: %s", currDir, err.Error())
  23. }
  24. fileName := fileObj.Name()
  25. files, err := ioutil.ReadDir(fileName)
  26. if err != nil {
  27. log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error())
  28. }
  29. var filesMap map[string]os.FileInfo = map[string]os.FileInfo{}
  30. var unSortedFilesNameArr []string = []string{}
  31. for _, file := range files {
  32. unSortedFilesNameArr = append(unSortedFilesNameArr, file.Name())
  33. filesMap[file.Name()] = file
  34. }
  35. sort.Strings(unSortedFilesNameArr)
  36. var sortedFilesArr []os.FileInfo = []os.FileInfo{}
  37. for _, stringName := range unSortedFilesNameArr {
  38. sortedFilesArr = append(sortedFilesArr, filesMap[stringName])
  39. }
  40. files = sortedFilesArr
  41. var newFileList []os.FileInfo = []os.FileInfo{}
  42. var length int
  43. if !printFiles {
  44. for _, file := range files {
  45. if file.IsDir() {
  46. newFileList = append(newFileList, file)
  47. }
  48. }
  49. files = newFileList
  50. }
  51. length = len(files)
  52. for i, file := range files {
  53. if file.IsDir() {
  54. var stringPrepender string
  55. if length > i+1 {
  56. fmt.Fprintf(output, prependingString+"├───"+"%s\n", file.Name())
  57. stringPrepender = prependingString + "│\t"
  58. } else {
  59. fmt.Fprintf(output, prependingString+"└───"+"%s\n", file.Name())
  60. stringPrepender = prependingString + "\t"
  61. }
  62. newDir := filepath.Join(currDir, file.Name())
  63. recursionPrintService(stringPrepender, output, newDir, printFiles)
  64. } else if printFiles {
  65. if file.Size() > 0 {
  66. if length > i+1 {
  67. fmt.Fprintf(output, prependingString+"├───%s (%vb)\n", file.Name(), file.Size())
  68. } else {
  69. fmt.Fprintf(output, prependingString+"└───%s (%vb)\n", file.Name(), file.Size())
  70. }
  71. } else {
  72. if length > i+1 {
  73. fmt.Fprintf(output, prependingString+"├───%s (empty)\n", file.Name())
  74. } else {
  75. fmt.Fprintf(output, prependingString+"└───%s (empty)\n", file.Name())
  76. }
  77. }
  78. }
  79. }
  80. }