Golang中如何查找目录中的文件

Golang中如何查找目录中的文件 请帮忙,任务是在一个目录中查找特定扩展名的所有文件,我该如何实现?

6 回复

谢谢,这个方法对我有效

更多关于Golang中如何查找目录中的文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


链接的文档提到,对于大型目录来说效率较低…

我在处理大型目录时(在Linux系统上)没有感觉到性能不足。可能对于真正非常大的目录来说效率会有所不足…

对于非常大的目录,你也可以使用 filepath.Walk表情符号

例如这样:

package main

import (
	"io/ioutil"
	"log"
	"os"
	"strings"
)

func main() {

	files, err := ioutil.ReadDir("./")
	if err != nil {
		log.Fatal(err)
	}

	target := []os.FileInfo{}

	for _, f := range files {
		if !f.IsDir() && strings.HasSuffix(f.Name(), ".go") {
			target = append(target, f)
			log.Println(f.Name())
		}
	}

}

但如果你能先提供你的代码会更好。

在Go语言中,可以使用标准库中的path/filepathos包来遍历目录并查找特定扩展名的文件。以下是一个完整的实现示例:

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "strings"
)

// 查找指定目录中特定扩展名的所有文件
func findFilesByExtension(rootDir, extension string) ([]string, error) {
    var files []string
    
    err := filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        
        // 检查是否为文件且扩展名匹配
        if !info.IsDir() && strings.EqualFold(filepath.Ext(path), extension) {
            files = append(files, path)
        }
        
        return nil
    })
    
    return files, err
}

func main() {
    // 示例:查找当前目录中所有的.txt文件
    files, err := findFilesByExtension(".", ".txt")
    if err != nil {
        fmt.Printf("遍历目录时出错: %v\n", err)
        return
    }
    
    fmt.Printf("找到 %d 个文件:\n", len(files))
    for _, file := range files {
        fmt.Println(file)
    }
}

如果需要更精确的扩展名匹配(区分大小写),可以将strings.EqualFold替换为直接比较:

if !info.IsDir() && filepath.Ext(path) == extension {
    files = append(files, path)
}

对于需要查找多种扩展名的情况:

func findFilesByExtensions(rootDir string, extensions []string) ([]string, error) {
    var files []string
    extMap := make(map[string]bool)
    
    for _, ext := range extensions {
        extMap[strings.ToLower(ext)] = true
    }
    
    err := filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        
        if !info.IsDir() {
            fileExt := strings.ToLower(filepath.Ext(path))
            if extMap[fileExt] {
                files = append(files, path)
            }
        }
        
        return nil
    })
    
    return files, err
}

// 使用示例
files, err := findFilesByExtensions(".", []string{".txt", ".go", ".md"})

这个实现会递归遍历指定目录及其所有子目录,返回匹配指定扩展名的所有文件路径。

回到顶部