Go 1.5关键字搜索目录、文件、文件内容_修复一个小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") //关键字,index
	flag.BoolVar(&c, "c", false, "-c=true")       //是否在文件内容搜索关键字,content
	flag.BoolVar(&f, "f", false, "-f=true")       //是否根据关键字查找文件,file
	flag.BoolVar(&d, "d", false, "-d=true")       //是否根据关键字查找文件夹,directory
	flag.Parse()
	if len(i) == 0 {
		fmt.Println("关键字不能为空")
		return
	}
	re = []byte(i)
	if err := filepath.Walk(p, walk); err != nil {
		fmt.Println("Walk:", err)
	}
	if count == 0 {
		fmt.Println("搜索路径:", p)
		fmt.Println("关键字:", i)
		if d {
			fmt.Println("是否搜索目录:", d)
		}
		if f {
			fmt.Println("是否搜索文件:", f)
		}
		if c {
			fmt.Println("是否搜索内容:", c)
		}
	}
	fmt.Printf("共发现 : %d\n", 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
}

//在文件中查找关键字
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行\n", 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行\n", path, i)
			fmt.Println(string(bytes.TrimSpace(b)))
		}
	}
	return nil
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经典的BUG案例之一是“1996年美国国际奥林匹克选手村计时系统故障”,该故障影响了所有奥运会运动员的比赛成绩。该系统是由IBM公司开发的,它使用了两个不同的计时系统来记录每个运动员的成绩。然而,在比赛期间,系统出现了故障,导致计时系统的时钟不同步,从而导致了运动员的成绩不准确。 该故障的缺陷原理是系统设计缺陷。在这个系统中,IBM公司使用了两个不同的计时系统来记录每个运动员的成绩,但是没有考虑到这两个系统的时钟同步问题。当一个系统的时钟出现偏差时,另一个系统的时钟仍然在正常运行,这会导致两个系统记录的成绩存在差异。 这个故障是由于系统测试不充分而导致的。如果IBM公司在测试阶段对系统进行更加全面的测试,可能会发现这个问题。此外,如果系统在实际运行中出现了故障,可以通过对系统进行性能监控来及时发现问题,并进行修复。 为了解决这个问题,IBM公司最终通过对系统进行修改来修复故障。他们加强了系统的测试,并对系统中的计时机制进行了改进,以确保两个计时系统的时钟同步。他们还增加了系统的监控功能,以便及时发现和修复类似的问题。 总之,这个经典的BUG案例告诉我们,在软件开发过程中,我们需要进行充分的测试和性能监控,以尽可能地发现和修复潜在的缺陷。同时,在系统设计时,需要考虑到各种可能的问题,并进行充分的优化和改进,以提高系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值