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

news/2024/7/4 14:57:18
给一个路径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)
        }
    }
}

  

 

转载于:https://www.cnblogs.com/chengsheng/p/10629270.html


http://www.niftyadmin.cn/n/3371134.html

相关文章

第四十天

表格 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>表格</title> <style type"text/css"> table { width: 600px; height: 400px; /*border: 1px solid #333;*/ } td, th { …

521. Longest Uncommon Subsequence I【easy】

521. Longest Uncommon Subsequence I【easy】 Given a group of two strings, you need to find the longest uncommon subsequence of this group of two strings. The longest uncommon subsequence is defined as the longest subsequence of one of these strings and thi…

数据库的一些基础知识

数据库&#xff08;Data Base&#xff09; 数据库&#xff08;Data Base&#xff0c;简称DB&#xff09;是长期存储在计算机内、有组织的、可共享的、统一管理的相关数据的集合。 关系型数据库 绝大多数的数据库系统叫做关系数据库系统&#xff08;relational database system&…

穷忙?~

一直以来,都觉得自己的生活过得好忙碌。。。。读书的时候&#xff0c;常常忙着去上课&#xff0c;或者去吃饭&#xff0c;因为吃完饭&#xff0c;还要忙着去宿舍休息&#xff08;中学的时候是要按时休息的&#xff09;&#xff0c;或者重新赶去上课。初中的时候&#xff0c;有个…

【转】将一棵树转换为二叉树后,为什么根节点没有右子树

树转化为二叉树时结点左子树是原来的孩子结点&#xff0c;右子树是原来的兄弟结点。即取根节点左孩子向右连接他的兄弟结点&#xff08;在同一层次的节点&#xff0c;原来互不相连&#xff09;并把它的子树&#xff0c;而把除左孩子外&#xff0c;原来与根节点相连的线擦除。这…

python之路_面向对象进阶

一、内置函数isinstance和issubclass 1、isinstance() isinstance(obj,cls)检查obj是否是类 cls 的对象&#xff0c;类似type()。 class Foo(object):pass obj Foo() print(isinstance(obj, Foo)) #输出结果&#xff1a;Trueprint(isinstance(10,int)) #输出结果&…

21、Samba配置详解

1、SMB介绍Samba可以实现Linux和Windows的文件共享 SMB&#xff08;Service Message Block&#xff09;涉及的端口smb&#xff1a;tcp 139 445nmbd udp 137 138samba用户是系统用户但密码是独立的&#xff0c;非/etc/shadow中的密码&#xff0c;使用smbpasswd设置访问smb的…

香甜的黄油 Sweet Butter

原题链接&#xff1a;https://www.luogu.org/problem/show?pid1828#sub 经典的最短路问题。 各位不要被题目条件迷惑了&#xff0c;牧场想象成点&#xff0c;道路想象成边&#xff0c;奶牛所在的位置想象成点权就好。 输入的是无向图&#xff0c;所以在正向连边时反向连边。然…