zoukankan      html  css  js  c++  java
  • 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
    }
    

  • 相关阅读:
    [设计模式]暂时不考虑多线程的单例模式
    [设计模式]策略模式
    [设计模式]工厂模式
    [设计模式]观察者模式1(用JDK提供的API)
    使用visual studio 2013 快速搭建phonegap开发环境
    js日期计算及快速获取周、月、季度起止日
    HTTP 错误 500.21
    C# 实现对网站数据的采集和抓取
    js设置控件的隐藏与显示的两种方法
    jQuery操作checkbox选择
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7339449.html
Copyright © 2011-2022 走看看