Dmitry Telenkov 18 tuntia sitten
vanhempi
commit
db699e8ea8

+ 84 - 0
go/stepik/course_3/base/task/foo1.go

@@ -0,0 +1,84 @@
+package main
+
+import (
+	"fmt"
+	"io"
+	"io/ioutil"
+	"log"
+	"os"
+	"path/filepath"
+	"sort"
+)
+
+func main() {
+	dirTree(os.Stdout, "..", true)
+}
+
+func dirTree(output io.Writer, currDir string, printFiles bool) error {
+	recursionPrintService("", output, currDir, printFiles)
+	return nil
+}
+
+func recursionPrintService(prependingString string, output io.Writer, 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())
+	}
+	fileName := fileObj.Name()
+	files, err := ioutil.ReadDir(fileName)
+	if err != nil {
+		log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error())
+	}
+	var filesMap map[string]os.FileInfo = map[string]os.FileInfo{}
+	var unSortedFilesNameArr []string = []string{}
+	for _, file := range files {
+		unSortedFilesNameArr = append(unSortedFilesNameArr, file.Name())
+		filesMap[file.Name()] = file
+	}
+	sort.Strings(unSortedFilesNameArr)
+	var sortedFilesArr []os.FileInfo = []os.FileInfo{}
+	for _, stringName := range unSortedFilesNameArr {
+		sortedFilesArr = append(sortedFilesArr, filesMap[stringName])
+	}
+	files = sortedFilesArr
+	var newFileList []os.FileInfo = []os.FileInfo{}
+	var length int
+	if !printFiles {
+		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(currDir, file.Name())
+			recursionPrintService(stringPrepender, output, newDir, printFiles)
+		} else if printFiles {
+			if file.Size() > 0 {
+				if length > i+1 {
+					fmt.Fprintf(output, prependingString+"├───%s (%vb)\n", file.Name(), file.Size())
+				} else {
+					fmt.Fprintf(output, prependingString+"└───%s (%vb)\n", file.Name(), file.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())
+				}
+			}
+		}
+	}
+}

+ 18 - 44
go/stepik/course_3/base/task/main.go

@@ -2,62 +2,36 @@ package main
 
 import (
 	"fmt"
+	"io"
+	"log"
 	"os"
 )
 
 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())
-	}
-
-	// fmt.Println(path, printFiles, len(os.Args))
-	// fmt.Printf("%T\n", out, err)
+	dirTree(os.Stdout, ".", true)
 }
 
-func dirTree(file *os.File, path string, printFiles bool) error {
-	var staticFile = file
-	fmt.Println("Function tree")
-	fmt.Println(file, path, printFiles)
+func dirTree(output io.Writer, currDir string, printFile bool) error {
+	recursionDirTree(currDir)
+	return nil
+}
 
-	// Открыть текущую директорию
-	dir, err := os.Open(path)
+// todo Разобраться с log, err.Error
+func recursionDirTree(currDir string) {
+	fileObj, err := os.Open(currDir)
+	defer fileObj.Close()
 	if err != nil {
-		// return err.Error()
-		return err
+		log.Fatalf("Could not open %s: %s", currDir, err.Error())
 	}
-	defer dir.Close()
 
-	// Получаем список файлов и папок
-	files, err := dir.Readdir(-1)
+	files, err := os.ReadDir(fileObj.Name())
 	if err != nil {
-		return err
+		log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error())
 	}
 
-	// Выводим имена файлов и папок
-	for _, file := range files {
-		if file.IsDir() {
-			fmt.Println("Directory: ", file.Name())
-			dirTree(staticFile, path, printFiles)
-		} else {
-			fmt.Println(file.Name())
-		}
-	}
+	var filesMap map[string]os.FileInfo = map
+
+	fmt.Printf("%T\n", files[0])
+	fmt.Println(files)
 
-	/*
-		file, err := os.Open("file.go") // For read access.
-		if err != nil {
-			log.Fatal(err)
-		}
-	*/
-	return nil
 }

+ 0 - 0
go/stepik/course_3/base/task/test_dir