在go语言中实现支持通配符递归搜索文件夹中的文件示例代码
Go  /  管理员 发布于 1个月前   67
在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
...
路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..博主 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 @ mashrdn 多切换几个节点测试,免费ssr是没那么稳..mashrdn 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 V2rayn免费节点添加上去了,youtobe无法打开网页,是怎么回事..张伟 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 3q!有用,不过免费节点隔天就要去git上复制新的导进去..博主 在
科学上网翻墙访问Google , 上外网神器佛跳墙VPN(永久免费)使用流程步骤中评论 该篇教程已不能用了,告知大家,免的老有老铁问我!..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号