Bootstrap

Golang实现文件搜索器


前言

这个搜索器使用到了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
}

;