• Go 1.5keyword搜索文件夹、文件、文件内容_修复一个小BUG


    package main
    
    import (
    	"bufio"
    	"bytes"
    	"flag"
    	"fmt"
    	"io"
    	"os"
    	"path/filepath"
    	"sync/atomic"
    )
    
    var re []byte
    var count int32
    var c, f, d bool
    var i, p string
    
    func main() {
    	flag.StringVar(&p, "p", "./", "-p=finddir")   //搜索的文件夹。默认是当前文件夹。path
    	flag.StringVar(&i, "r", "", "-r=matchstring") //keyword。index
    	flag.BoolVar(&c, "c", false, "-c=true")       //是否在文件内容搜索keyword,content
    	flag.BoolVar(&f, "f", false, "-f=true")       //是否依据keyword查找文件,file
    	flag.BoolVar(&d, "d", false, "-d=true")       //是否依据keyword查找文件夹,directory
    	flag.Parse()
    	if len(i) == 0 {
    		fmt.Println("keyword不能为空")
    		return
    	}
    	re = []byte(i)
    	if err := filepath.Walk(p, walk); err != nil {
    		fmt.Println("Walk:", err)
    	}
    	if count == 0 {
    		fmt.Println("搜索路径:", p)
    		fmt.Println("keyword:", i)
    		if d {
    			fmt.Println("是否搜索文件夹:", d)
    		}
    		if f {
    			fmt.Println("是否搜索文件:", f)
    		}
    		if c {
    			fmt.Println("是否搜索内容:", c)
    		}
    	}
    	fmt.Printf("共发现 : %d
    ", count)
    }
    func walk(path string, info os.FileInfo, err error) error {
    	if err != nil {
    		return err
    	}
    	if info.IsDir() {
    		if d && bytes.Contains([]byte(info.Name()), re) {
    			atomic.AddInt32(&count, 1)
    			fmt.Println("匹配到文件夹:", path)
    		}
    		return nil
    	}
    
    	if f {
    		if bytes.Contains([]byte(info.Name()), re) {
    			atomic.AddInt32(&count, 1)
    			fmt.Println("匹配到文件:", path)
    			return nil
    		}
    	}
    	if c {
    		return read(path)
    	}
    	return nil
    }
    
    //在文件里查找keyword
    func read(path string) error {
    	File, err := os.Open(path)
    	defer File.Close()
    	if err != nil {
    		fmt.Println(path, ":", err)
    		return err
    	}
    	r := bufio.NewReader(File)
    	i := 0
    	for {
    		i++
    		b, _, err := r.ReadLine()
    		if bytes.Contains(b, []byte{0}) { //排除二进制文件
    			return nil
    		}
    		if err != nil {
    			if err == io.EOF {
    				if bytes.Contains(b, re) {
    					atomic.AddInt32(&count, 1)
    					fmt.Printf("在文件:%s第 %d行
    ", path, i)
    					fmt.Println(string(bytes.TrimSpace(b)))
    				}
    				return nil
    			}
    			return err
    		}
    		if bytes.Contains(b, re) {
    			atomic.AddInt32(&count, 1)
    			fmt.Printf("在文件:%s第 %d行
    ", path, i)
    			fmt.Println(string(bytes.TrimSpace(b)))
    		}
    	}
    	return nil
    }
    

  • 相关阅读:
    【移动自动化】【三】控件定位
    【移动自动化】【二】Appium
    【自动化测试:笔记一】adb命令
    mysql api
    计算经纬度的正方形边界
    转 高效的多维空间点索引算法 — Geohash 和 Google S2
    转 为什么geometry+GIST 比 geohash+BTREE更适合空间搜索
    转 HBase GC日志
    转 HBase最佳实践-CMS GC调优
    转:HBase最佳实践-内存规划
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7339449.html
Copyright © 2020-2023  润新知