给一个路径path,一个关键字keyword,选出:(1).所有包含keyword的目录 (2).名字包含keyword的文件 (3).内容中包含keyword的文件
/*
查找paths目录下包含关键字的结果
case1 是目录,包含关键字
case2 是文件,文件名路径包含关键字
case3 文件内容包含关键字
*/
func FindKeyword(paths string, keyword string) {
//读取paths文件信息,结果是os.FileInfo类型
fileinfo, err := os.Stat(paths)
if err != nil {
fmt.Println(err)
}
//FileInfo有IsDir()方法可以判断是否是目录,还有Mode()方法返回FileMode类型的结果,表示文件的模式和权限
//等价于FileMode类型的IsDir()方法,FileMode还有IsRegular()判断是否是普通文件
if fileinfo.IsDir() {
if strings.Contains(paths, keyword) {
fmt.Println("case1:" + paths)
}
//读取paths这个目录下的所有文件信息,返回的是os.FileInfo类型
fileinfos, err := ioutil.ReadDir(paths)
if err != nil {
fmt.Println(err)
}
for _, fi := range fileinfos {
//Name()方法返回文件信息中的文件名
fname := fi.Name()
//将paths和fname使用slash连接起来
newpaths := filepath.Join(paths, fname)
fmt.Println(newpaths)
FindKeyword(newpaths, keyword)
}
} else {
//文件名路径中有关键字
if strings.Contains(paths, keyword) {
fmt.Println("case2:" + paths)
}
//读取文件的全部内容
content, err := ioutil.ReadFile(paths)
if err != nil {
fmt.Println(err)
}
//文件内容中有关键字
if strings.Contains(string(content), keyword) {
fmt.Println("case3:" + paths)
}
}
}
另外一种方法,使用os包中的方法来实现
func findKeyword(paths string, keyword string) {
var fi os.FileInfo
var err error
if fi, err = os.Stat(paths); err != nil {
fmt.Println(err)
}
//获取文件信息中的类型、权限
fm := fi.Mode()
if fm.IsDir() {
//fi.IsDir()与上面功能相同
//目录包含
if cts := strings.Contains(paths, keyword); cts {
fmt.Printf("case 1: %s
", paths)
}
//*File类型的结果
file, err := os.Open(paths)
defer file.Close()
if err != nil {
fmt.Println(err)
}
//Readdirnames()方法返回目录下的内容,类型是字符串切片
dirnames, err := file.Readdirnames(0)
//Readdir()方法返回FileInfo类型的切片
//fileinfos, err := file.Readdir(0)
if err != nil {
fmt.Println(err)
}
for _, name := range dirnames {
//newFN := paths + "/" + name
newFN := path.Join(paths, name)
findKeyword(newFN, keyword)
}
} else {
cts := strings.Contains(paths, keyword)
//文件路径包含
if cts {
fmt.Printf("case 2:%s
", paths)
}
file, err := os.Open(paths)
defer file.Close()
//文件内容包含
content := make([]byte, 10000)
//Read()方法读取len(content)长度的字节到content中,返回读取的字节数
//文件中字节数超过10000的内容会读不到
readn, err := file.Read(content)
if readn <= 0 || err != nil {
fmt.Printf("readn:%d %v
", readn, err)
}
if strings.Contains(string(content), keyword) {
fmt.Printf("case 3:%s
", paths)
}
}
}