zoukankan      html  css  js  c++  java
  • 给定一个目录查找目录下包含关键字的目录和文件

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

      

  • 相关阅读:
    Redis和Memcache的区别
    j2EE框架collection
    总结乐观锁和悲观锁
    lunix,命令集锦
    遍历Map集合的方法
    arrayList和vector的区别
    python借助zookeeper实现分布式服务(二)
    python借助zookeeper实现分布式服务(一)
    zookeeper常用命令
    python实现事件驱动模型
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10629270.html
Copyright © 2011-2022 走看看