给定一个目录查找目录下包含关键字的目录和文件

给一个路径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)
        }
    }
}

  

原文地址:https://www.cnblogs.com/chengsheng/p/10629270.html