go基础库之列出目录

本文将展示如何列出目录内容。

列出目录

Golang 版本

1.12.1

前言

本文将展示如何列出目录内容。

实现

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
)

func main() {

	fmt.Println("List by ReadDir")
	listDirByReadDir(".")
	fmt.Println()
	fmt.Println("List by Walk")
	listDirByWalk(".")
}

func listDirByWalk(path string) {
	filepath.Walk(path, func(wPath string, info os.FileInfo,
		err error) error {

		if wPath == path {
			return nil
		}

		if info.IsDir() {
			fmt.Printf("[%s]\n", wPath)
			return filepath.SkipDir
		}

		if wPath != path {
			fmt.Println(wPath)
		}
		return nil
	})
}

func listDirByReadDir(path string) {
	lst, err := ioutil.ReadDir(path)
	if err != nil {
		panic(err)
	}
	for _, val := range lst {
		if val.IsDir() {
			fmt.Printf("[%s]\n", val.Name())
		} else {
			fmt.Println(val.Name())
		}
	}
}
$ go run main.go
List by ReadDir
[folder]
main.go

List by Walk
[folder]
main.go

原理

列出上述示例的文件夹使用了两种方法。 第一个简单的方法是使用listDirByReadDir函数实现,并使用ioutil包中的ReadDir函数。 此函数返回实际目录内容的FileInfo结构片。 请注意,ReadDir函数不会递归读取文件夹。 实际上,ReadDir函数在内部使用os包中的File类型的Readdir方法。

另一种方法,更复杂,listDirByWalk使用filepath.Walk函数,该函数遍历路径并具有处理任何给定路径中的每个文件或文件夹的函数。 主要区别在于Walk函数以递归方式读取目录。 这种方法的核心部分是WalkFunc类型,其功能是使用列表的结果。 请注意,该函数通过返回filepath.SkipDir错误来阻止对基础文件夹的递归调用。 Walk函数也首先处理被调用的路径,所以你也需要处理它(在这种情况下,我们跳过打印并返回nil,因为我们需要递归处理这个文件夹)。