在go语言中实现支持通配符递归搜索文件夹中的文件示例代码
Go  /  管理员 发布于 1年前   340
在Go语言中实现从目标目录开始搜索文件并递归搜索其所有子目录的代码示例。
该示例支持文件名通配符搜索,并对给定的搜索参数进行简单的正确性检查。
注意:
如果你尝试执行以下命令
./findFileRecursively ./ *.go
一直收到 USAGE 提示的话,
请先用 \ 或 /(Windows)转义星号 * - ./findFileRecursively ./ \*.go
代码示例:
package main
import (
"fmt"
"os"
"path/filepath"
)
var (
targetFolder string
targetFile string
searchResult []string
)
func findFile(path string, fileInfo os.FileInfo, err error) error {
if err != nil {
fmt.Println(err)
return nil
}
// 获取搜索文件夹的绝对路径
absolute, err := filepath.Abs(path)
if err != nil {
fmt.Println(err)
return nil
}
if fileInfo.IsDir() {
fmt.Println("搜索目录 ... ", absolute)
// 扫描文件夹的权限是否正确?
testDir, err := os.Open(absolute)
if err != nil {
if os.IsPermission(err) {
fmt.Println("无扫描权限 ... ", absolute)
fmt.Println(err)
}
}
testDir.Close()
return nil
} else {
// 确定,我们正在处理一个文件
// 这是目标文件吗?
// 是的,还需要支持通配符搜索
// https://www.socketloop.com/tutorials/golang-match-strings-by-wildcard-patterns-with-filepath-match-function
matched, err := filepath.Match(targetFile, fileInfo.Name())
if err != nil {
fmt.Println(err)
}
if matched {
// 是的,添加到我们的搜索结果中
add := "已找到 : " + absolute
searchResult = append(searchResult, add)
}
}
return nil
}
func main() {
if len(os.Args) != 3 {
fmt.Printf("USAGE : %s <target_directory> <target_file> \n", os.Args[0])
os.Exit(0)
}
targetFolder = os.Args[1]
targetFile = os.Args[2]
fmt.Println("搜索 [", targetFile, "]")
fmt.Println("从目录开始 [", targetFolder, "]")
// sanity check
testFile, err := os.Open(targetFolder)
if err != nil {
fmt.Println(err)
os.Exit(-1)
}
defer testFile.Close()
testFileInfo, _ := testFile.Stat()
if !testFileInfo.IsDir() {
fmt.Println(targetFolder, " 不是一个目录!")
os.Exit(-1)
}
err = filepath.Walk(targetFolder, findFile)
if err != nil {
fmt.Println(err)
os.Exit(-1)
}
// display our search result
fmt.Println("\n\n已找到 ", len(searchResult), " 条信息")
fmt.Println("####################")
for _, v := range searchResult {
fmt.Println(v)
}
}
输出:
./findFileRecursively ./ *main.go
搜索 [ *main.go ]
从目录开始 [ ./ ]
搜索目录 ... /Users/sweetlogic
搜索目录 ... /Users/sweetlogic/.Trash
搜索目录 ... /Users/sweetlogic/.atom
搜索目录 ... /Users/sweetlogic/.atom/.apm
搜索目录 ... /Users/sweetlogic/.atom/blob-store
搜索目录 ... /Users/sweetlogic/.atom/compile-cache
搜索目录 ... /Users/sweetlogic/.atom/compile-cache/coffee
...
已找到 103 条信息
####################
已找到 : /Users/sweetlogic/.go/src/HelloGoglandNonSingle/main.go
已找到 : /Users/sweetlogic/.go/src/github.com/golang/freetype/example/truetype/main.go
已找到 : /Users/sweetlogic/.go/src/github.com/golang/lint/testdata/blank-import-main.go
...
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号