前言
这个搜索器使用到了Golang flag命令行解析,文件夹递归遍历等技能点,用户可以指定搜索的文件夹和文件名。
一、文件搜索器
在使用windows系统时,发现在一个工程中寻找文件比较麻烦,没有Linux的find指令方便。所有,我使用Golang实现了一个类似的文件搜索器,用户可以指定搜索文件名和文件夹。
二、使用步骤
1.查看帮助
.\searchfile.exe -help
Usage of D:\develop\code\go\searchFile\searchfile.exe:
-d string
Search directory (default "D:/")
-f string
File to search. (default "file.txt")
2.查询文件
输入指令
.\searchfile.exe -d D:/xxx-f GuideExport.h
打印结果
开始搜索...
Fine GuideExport.h in Path: D:/xxx/include
----------------------------------------
Fine GuideExport.h in Path: D:/xxx/xxx/Depend/xxx/xxx
----------------------------------------
Fine GuideExport.h in Path: D:/xxx/xxx/Include
----------------------------------------
搜索结束.
三、代码说明
1.命令行参数解析
Go语言中,flag包支持用户自定义命令行参数。我们使用这个功能读入用户输入的查询文件名和查询文件夹。实现代码如下
var targetFile string
var targetDir string
func init() {
flag.StringVar(&targetFile, "f", "file.txt", "File to search.")
flag.StringVar(&targetDir, "d", "D:/", "Search directory")
flag.Parse()
}
2.递归查询实现
在获取到用户输入的根文件夹后,我们要递归查询这个文件夹和文件夹中的子文件夹。直到遍历所有子文件夹后,我们的查询结束。
func searchFile(filename, dir string) error {
files, err := ioutil.ReadDir(dir)
if err != nil {
return err
}
for _, curfile := range files {
if curfile.IsDir() {
//找到子文件夹,递归查找
searchFile(filename, dir+"/"+curfile.Name())
} else {
// 找到文件,查看文件名
resultFlag = true
if curfile.Name() == filename {
fmt.Printf("Fine %s in Path: ", targetFile)
fmt.Println(dir)
fmt.Println("----------------------------------------")
}
}
}
return nil
}
四、完整代码
package main
import (
"flag"
"fmt"
"io/ioutil"
)
var targetFile string
var targetDir string
var resultFlag bool
func init() {
flag.StringVar(&targetFile, "f", "file.txt", "File to search.")
flag.StringVar(&targetDir, "d", "D:/", "Search directory")
flag.Parse()
}
func main() {
fmt.Println("开始搜索...")
resultFlag = false
searchFile(targetFile, targetDir)
if !resultFlag {
fmt.Println("未搜索到结果.")
}
fmt.Println("搜索结束.")
}
func searchFile(filename, dir string) error {
files, err := ioutil.ReadDir(dir)
if err != nil {
return err
}
for _, curfile := range files {
if curfile.IsDir() {
//找到子文件夹,递归查找
searchFile(filename, dir+"/"+curfile.Name())
} else {
// 找到文件,查看文件名
resultFlag = true
if curfile.Name() == filename {
fmt.Printf("Fine %s in Path: ", targetFile)
fmt.Println(dir)
fmt.Println("----------------------------------------")
}
}
}
return nil
}