package main import ( "fmt" "io" "log" "os" "path/filepath" ) func main() { // dirTree(os.Stdout, "..", true) foo("", os.Stdout, "..", true) // sizeTest() } func sizeTest() { fileInfo, err := os.Stat("foo1.go") if err != nil { fmt.Println("!") } fmt.Println(fileInfo.Size(), err) } func dirTree(output io.Writer, currDir string, printFile bool) error { recursionDirTree(currDir, false) return nil } func foo(prependingString string, output io.Writer, dir string, print bool) { fileObj, err := os.Open(dir) defer fileObj.Close() if err != nil { log.Fatalf("Could not open %s: %s", dir, err.Error()) } // files - слайс fs.DirEntry // os.ReadDir возвращает отсортированный слайс DirEntry files, err := os.ReadDir(fileObj.Name()) if err != nil { log.Fatalf("Could not read dir names in %s: %s", dir, err.Error()) } var filesMap map[string]os.DirEntry = map[string]os.DirEntry{} var sortedFilesNameArr []string = []string{} for _, file := range files { sortedFilesNameArr = append(sortedFilesNameArr, file.Name()) filesMap[file.Name()] = file } var newFileList []os.DirEntry = []os.DirEntry{} var length int // Печатаем только папки if !print { for _, file := range files { if file.IsDir() { newFileList = append(newFileList, file) } } files = newFileList } length = len(files) for i, file := range files { if file.IsDir() { var stringPrepender string if length > i+1 { fmt.Fprintf(output, prependingString+"├───"+"%s\n", file.Name()) stringPrepender = prependingString + "│\t" } else { fmt.Fprintf(output, prependingString+"└───"+"%s\n", file.Name()) stringPrepender = prependingString + "\t" } newDir := filepath.Join(dir, file.Name()) foo(stringPrepender, output, newDir, print) } else if print { fileInfo, err := file.Info() if err != nil { log.Fatalf("Could not get fileInfo for %s:", file.Name()) } size := fileInfo.Size() if size > 0 { if length > i+1 { fmt.Fprintf(output, prependingString+"├───%s (%vb)\n", file.Name(), size) } else { fmt.Fprintf(output, prependingString+"└───%s (%vb)\n", file.Name(), size) } } else { if length > i+1 { fmt.Fprintf(output, prependingString+"├───%s (empty)\n", file.Name()) } else { fmt.Fprintf(output, prependingString+"└───%s (empty)\n", file.Name()) } } } } /* fmt.Println(sortedFilesNameArr) fmt.Println(filesMap) fmt.Println(files) */ } // todo Разобраться с log, err.Error func recursionDirTree(currDir string, printFiles bool) { fileObj, err := os.Open(currDir) defer fileObj.Close() if err != nil { log.Fatalf("Could not open %s: %s", currDir, err.Error()) } files, err := os.ReadDir(fileObj.Name()) if err != nil { log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error()) } // os.ReadDir возвращает отсортированный слайс DirEntry var sortedFilesNameArr []string = []string{} var filesMap map[string]os.DirEntry = map[string]os.DirEntry{} for _, file := range files { sortedFilesNameArr = append(sortedFilesNameArr, file.Name()) filesMap[file.Name()] = file } // Превращаем слайс всех объектов (файлов и папок) в слайс только папок // если printFiles == false var dirList []os.DirEntry = []os.DirEntry{} if !printFiles { for _, file := range files { if file.IsDir() { dirList = append(dirList, file) } } files = dirList } var length int = len(files) fmt.Println(length) // for i, file := range files{} // fmt.Println(files) // fmt.Println(unSortedFilesNameArr) // fmt.Println(sortedFilesArr) // fmt.Printf("%T\n", files[0]) // fmt.Println(files) }