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[:])
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Go Fiber 및 PlanetScale로 REST API 구축 - 4부다시 사용자 핸들러에 UpdateUser라는 새 함수를 추가합니다. 업데이트 사용자를 main.go에 등록 이제 응용 프로그램을 다시 실행하십시오. 이전에 생성한 사용자를 업데이트합니다. 응답 사용자가 존재하지 않을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.