Golang遍历目录:排除特定目录和文件

在Golang中,我们经常需要遍历目录并获取文件信息。本文将介绍如何使用filepath.Walk函数遍历目录,并通过自定义规则排除特定目录和文件,例如排除名称以'@'符号开头的目录和所有文件。

代码示例

package main

import (
	'fmt'
	'os'
	'path/filepath'
)

func main() {
	root := '.' // 遍历当前目录
	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if path == root {
			return nil // 跳过根目录
		}

		if info.IsDir() && filepath.Base(path)[0] == '@' {
			return filepath.SkipDir // 跳过第一级目录名中带有@符号的目录
		}

		if !info.IsDir() {
			return nil // 跳过所有文件
		}

		fmt.Println('Directory:', path)

		// 遍历子目录
		err = filepath.Walk(path, func(subPath string, subInfo os.FileInfo, subErr error) error {
			if subErr != nil {
				return subErr
			}

			if subInfo.IsDir() {
				fmt.Println('Subdirectory:', subPath)
				return nil // 继续遍历子目录
			}

			fmt.Println('File:', subPath)

			return nil
		})

		if err != nil {
			return err
		}

		return nil
	})

	if err != nil {
		fmt.Println(err)
	}
}

代码解读

  1. filepath.Walk函数: 该函数递归遍历目录树,并为每个遇到的文件或目录调用回调函数。
  2. 回调函数: 代码中定义了一个匿名回调函数,它接收三个参数:
    • path:当前文件或目录的路径。
    • info:os.FileInfo类型的结构体,包含文件或目录的信息。
    • err:遍历过程中遇到的错误。
  3. 排除逻辑:
    • 首先,判断当前路径是否为根目录,如果是则跳过。
    • 接着,判断当前路径是否为以'@'符号开头的目录,如果是则使用filepath.SkipDir跳过该目录及其子目录。
    • 最后,判断当前路径是否为文件,如果是则跳过。
  4. 遍历子目录:
    • 如果当前路径是目录且不符合排除条件,则再次调用filepath.Walk函数遍历子目录。

总结

通过自定义回调函数和filepath.Walk函数,我们可以灵活地控制目录遍历行为,并根据需求排除特定目录或文件。

Golang遍历目录:排除特定目录和文件

原文地址: https://www.cveoy.top/t/topic/jod8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录