golang의 폴더를 훑어보고 파일을 줄별로 출력합니다

3647 단어 go
package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
)

// 
type dirTreeNode struct {
	name  string
	child []dirTreeNode
}

var iCount int = 0

// 
func getDirTree(pathName string) (dirTreeNode, error) {

	rd, err := ioutil.ReadDir(pathName)
	if err != nil {
		log.Fatalf("Read dir '%s' failed: %v", pathName, err)
	}
	var tree, childNode dirTreeNode
	tree.name = pathName
	var name, fullName string
	for _, fileDir := range rd {
		name = fileDir.Name()
		fullName = pathName + "/" + name
		if fileDir.IsDir() {
			childNode, err = getDirTree(fullName)
			if err != nil {
				log.Fatalf("Read dir '%s' failed: %v", fullName, err)
			}
		} else {
			childNode.name = name
			childNode.child = nil

			// 
			readLine(fullName, processLine)
			iCount++
		}
		tree.child = append(tree.child, childNode)
	}
	return tree, nil
}

// 
func printDirTree(tree dirTreeNode, prefix string) {
	fmt.Println(prefix + tree.name)
	if len(tree.child) > 0 {
		prefix += "----"
		for _, childNode := range tree.child {
			printDirTree(childNode, prefix)
		}
	}
}

func processLine(line []byte) {
	os.Stdout.Write(line)
}

// read one file and use hookfn to process each line
func readLine(filePth string, hookfn func([]byte)) error {
	f, err := os.Open(filePth)
	if err != nil {
		return err
	}
	defer f.Close()

	bfRd := bufio.NewReader(f)
	for {
		line, err := bfRd.ReadBytes('
') hookfn(line) // , , 。 if err != nil { // , EOF if err == io.EOF { return nil } return err } } } func main() { dirName := "Users/" tree, err := getDirTree(dirName) if err != nil { log.Fatalln("read dir", dirName, "fail: ", err) } fmt.Printf("
") fmt.Println("File Count:", iCount) printDirTree(tree, "") }

이상은 ioutil입니다.디렉터리 노드를 range로 훑어보는 list

ReadDir 함수

func ReadDir(dirname string) ([]os.FileInfo, error)

dirname에서 지정한 디렉터리를 읽고 파일 이름에 따라 정렬된 디렉터리 노드 목록을 되돌려줍니다.
 
반복하는 과정은 또 다른 방법을 사용할 수 있다.
filepath를 사용합니다.Walk 패키지의 기능 path/filepath 파일 트리
filepath.WalkFunc, 트리의 모든 파일이나 디렉터리에 루트를 포함한 형식의 함수를 호출합니다.서류는 어휘순으로 간다.기호 링크를 따르지 않습니다.이 예시의 코드는 현재 디렉터리를 루트로 하는 파일 트리의 모든 파일과 디렉터리의 경로와 크기를 보여 줍니다.
err := filepath.Walk(".",
    func(path string, info os.FileInfo, err error) error {
    if err != nil {
        return err
    }
    fmt.Println(path, info.Size())
    return nil
})
if err != nil {
    log.Println(err)
}

 
 
 
 
별도:
파일 쓰기 정보
WriteFile 방법:
func check(e error) { 
if e != nil { 
panic(e) 
} 
}

 
var d1 = []byte(wireteString); 
err2 := ioutil.WriteFile(“./output2.txt”, d1, 0666) // ( ) 
check(err2)

WriteFile은 filename에서 지정한 파일에 데이터를 기록합니다.파일이 존재하지 않으면 WriteFile은 이 파일을 만들고 파일의 권한은perm입니다.파일이 존재하면 파일 내용을 비우고 쓰십시오.
 
WriteString 방법:
var testString = “ n” 
var filename = “./output1.txt”; 
var f *os.File 
var err1 error; 
if checkFileIsExist(filename) { //  
f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //  
fmt.Println(“ ”); 
}else { 
f, err1 = os.Create(filename) //  
fmt.Println(“ ”); 
} 
check(err1) 
n, err1 := io.WriteString(f, testString ) // ( ) 
check(err1) 
fmt.Printf(“  %d  n”, n);

 
 
 
별도:
golang []byte와string 상호 변환:
str2 := "hello"
    data2 := []byte(str2)
    fmt.Println(data2)
    str2 = string(data2[:])

 

좋은 웹페이지 즐겨찾기