golang工具类,支持根据指定文件扩展名(如.shp或.zip)搜索所在文件夹路径
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)
}
}
关键特性说明
- 扩展名规范化:
- 自动添加扩展名前的点(
shp→.shp) - 大小写不敏感匹配(
.SHP、.Shp、.shp都会被识别)
- 自动添加扩展名前的点(
- 跨平台支持:
- 使用
filepath包处理路径分隔符(Windows使用\,Linux/macOS使用/) - 自动处理不同操作系统的路径格式
- 使用
- 高效遍历:
- 使用
filepath.WalkDir进行递归遍历(Go 1.16+) - 仅检查文件(跳过目录)
- 使用map自动去重
- 使用
- 健壮性:
- 检查根目录是否存在
- 优雅处理遍历错误
- 返回明确的错误信息
使用说明
-
编译和运行:
go build -o file_finder ./file_finder -
使用示例:
// 搜索.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
注意事项
- 路径格式:
- Windows:推荐使用
C:/GIS_Data(正斜杠)或C:\\GIS_Data(双反斜杠) - Linux/macOS:使用
/home/user/data
- Windows:推荐使用
- 扩展名输入:
- 传入扩展名时,可以使用:
.shp(带点)shp(不带点,程序会自动添加)
- 例如:
"shp"或".shp"
- 传入扩展名时,可以使用:
- 错误处理:
- 如果根目录不存在,返回
root directory does not exist错误 - 遍历过程中出现的错误会返回具体错误信息
- 如果根目录不存在,返回
- 性能考虑:
- 对于大型目录结构,遍历可能需要一些时间
- 仅遍历一次文件系统(
WalkDir),效率较高
为什么使用Go实现
- 跨平台:Go代码在Windows、Linux、macOS上编译运行无需修改
- 高效:Go的并发和文件系统处理性能优异
- 简洁:标准库提供完善的文件系统处理功能
- 内存友好:使用map去重,避免重复存储路径
此实现可以灵活地搜索.shp、.zip或其他任何文件类型所在文件夹路径。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

