Go语言遍历文件夹的两种方法

过滤函数

func exclude(dir, path string) bool {
	rel, _ := filepath.Rel(dir, path)
	segs := strings.Split(rel, fmt.Sprintf("%c", os.PathSeparator))
	if segs[0] == ".git" || segs[0] == ".idea" {
		return true
	}

	name := filepath.Base(path)
	if name == ".DS_Store" {
		return true
	}
	return false
}

第一种方法(使用path/filepath.Walk)

func getFileList(dir string) []string {
	list := make([]string, 0)
	filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if info.IsDir() {
			return nil
		}
		if exclude(dir, path) {
			return nil
		}
		list = append(list, path)
		return nil
	})
	return list
}

第二种方法(使用ioutil.ReadDir)

func readDirAll(dir string) []string {
	list := make([]string, 0)

	var f func(string, string)
	f = func(root string, rel string) {
		files, err := ioutil.ReadDir(filepath.Join(root, rel))
		if err != nil {
			panic(err)
		}
		for _, file := range files {
			if file.IsDir() {
				f(root, filepath.Join(rel, file.Name()))
				continue
			}
			path := filepath.Join(root, rel, file.Name())
			if exclude(root, path) {
				continue
			}
			list = append(list, path)
		}
	}

	f(dir, ".")
	return list
}

总结

以上两种实现方式都使用了闭包 (list)来收集遍历结果,也可以采用传递指针的方式来实现。

Comment on Gist

Contents