Go语言实现的工具,用于遍历指定路径并查找包含指定扩展名文件(如.shp.zip)的文件夹路径:

package main

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

// FindFoldersWithExtension 查找指定路径下包含指定扩展名文件的文件夹路径
// @param rootPath 根目录路径
// @param extension 要搜索的文件扩展名(如".shp"或"shp")
// @return 包含指定扩展名文件的文件夹路径列表
func FindFoldersWithExtension(rootPath, extension string) ([]string, error) {
	// 规范化扩展名:确保以点开头
	if !strings.HasPrefix(extension, ".") {
		extension = "." + extension
	}
	// 转换为小写用于大小写不敏感匹配
	extension = strings.ToLower(extension)
	// 检查根目录是否存在
	if _, err := os.Stat(rootPath); os.IsNotExist(err) {
		return nil, fmt.Errorf("root directory does not exist: %s", rootPath)
	}
	// 使用map去重记录匹配的文件夹
	matchedFolders := make(map[string]struct{})
	// 递归遍历目录
	err := filepath.WalkDir(rootPath, func(path string, d os.DirEntry, err error) error {
		if err != nil {
			return err
		}
		// 跳过目录本身(我们只关心文件)
		if d.IsDir() {
			return nil
		}
		// 检查文件扩展名
		if strings.HasSuffix(strings.ToLower(d.Name()), extension) {
			// 获取文件所在目录路径
			dir := filepath.Dir(path)
			matchedFolders[dir] = struct{}{}
		}
		return nil
	})

	if err != nil {
		return nil, err
	}

	// 将map转换为切片
	result := make([]string, 0, len(matchedFolders))
	for dir := range matchedFolders {
		result = append(result, dir)
	}

	return result, nil
}

func main() {
	// 示例1:搜索.shp文件所在文件夹
	shpFolders, err := FindFoldersWithExtension("C:/GIS_Data", "shp")
	if err != nil {
		fmt.Printf("Error searching .shp files: %v\n", err)
		return
	}
	fmt.Println("包含.shp文件的文件夹路径:")
	for _, folder := range shpFolders {
		fmt.Println(folder)
	}

	// 示例2:搜索.zip文件所在文件夹
	zipFolders, err := FindFoldersWithExtension("C:/Archive", "zip")
	if err != nil {
		fmt.Printf("Error searching .zip files: %v\n", err)
		return
	}
	fmt.Println("\n包含.zip文件的文件夹路径:")
	for _, folder := range zipFolders {
		fmt.Println(folder)
	}
}

关键特性说明

  1. 扩展名规范化
    • 自动添加扩展名前的点(shp.shp
    • 大小写不敏感匹配(.SHP.Shp.shp 都会被识别)
  2. 跨平台支持
    • 使用filepath包处理路径分隔符(Windows使用\,Linux/macOS使用/
    • 自动处理不同操作系统的路径格式
  3. 高效遍历
    • 使用filepath.WalkDir进行递归遍历(Go 1.16+)
    • 仅检查文件(跳过目录)
    • 使用map自动去重
  4. 健壮性
    • 检查根目录是否存在
    • 优雅处理遍历错误
    • 返回明确的错误信息

使用说明

  1. 编译和运行

    go build -o file_finder
    ./file_finder
    
  2. 使用示例

    // 搜索.shp文件所在文件夹
    shpFolders, _ := FindFoldersWithExtension("C:/data", "shp") // 或 "shp"
    
    // 搜索.zip文件所在文件夹
    zipFolders, _ := FindFoldersWithExtension("/home/user/archive", ".zip") // 或 "zip"
    

输出示例

假设目录结构:

C:/
└── GIS_Data/
    ├── Project1/
    │   ├── data.shp
    │   └── metadata.txt
    ├── Project2/
    │   └── data.zip
    └── Project3/
        ├── map.shp
        └── report.pdf

程序输出:

包含.shp文件的文件夹路径:
C:/GIS_Data/Project1
C:/GIS_Data/Project3

包含.zip文件的文件夹路径:
C:/GIS_Data/Project2

注意事项

  1. 路径格式
    • Windows:推荐使用C:/GIS_Data(正斜杠)或C:\\GIS_Data(双反斜杠)
    • Linux/macOS:使用/home/user/data
  2. 扩展名输入
    • 传入扩展名时,可以使用:
      • .shp(带点)
      • shp(不带点,程序会自动添加)
    • 例如:"shp"".shp"
  3. 错误处理
    • 如果根目录不存在,返回root directory does not exist错误
    • 遍历过程中出现的错误会返回具体错误信息
  4. 性能考虑
    • 对于大型目录结构,遍历可能需要一些时间
    • 仅遍历一次文件系统(WalkDir),效率较高

为什么使用Go实现

  1. 跨平台:Go代码在Windows、Linux、macOS上编译运行无需修改
  2. 高效:Go的并发和文件系统处理性能优异
  3. 简洁:标准库提供完善的文件系统处理功能
  4. 内存友好:使用map去重,避免重复存储路径

此实现可以灵活地搜索.shp.zip或其他任何文件类型所在文件夹路径。