给一个路径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\n", 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\n", 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\t%v\n", readn, err) } if strings.Contains(string(content), keyword) { fmt.Printf("case 3:%s\n", paths) } } }