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\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
} //在文件里查找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行\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
}
Go 1.5keyword搜索文件夹、文件、文件内容_修复一个小BUG的更多相关文章
- 重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件
原文:重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件 [源码下载] 重新想象 Windows 8 Store Apps ( ...
- 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件
[源码下载] 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件 作者:webabcd 介绍背水一战 Windows 10 之 ...
- 使用FileSystemWatcher监控文件夹及文件
引言 这一周主要精力集中学习一个同事开发的本地文件搜索项目上,其中客户端添加共享文件时主要是使用FileSystemWatcher 监控文件,并在各种事件发生时向服务器发送消息. 解决方法 FileS ...
- TortoiseSVN文件夹及文件图标不显示解决方法
由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图标,这个问题前一段时间就遇到了(那个时 ...
- Projects\Portal_Content\Indexer\CiFiles文件夹下文件占用磁盘空间过大问题。
C:\Program Files\Microsoft Office Servers\12.0\Data\Office Server\Applications\9765757d-15ee-432c-94 ...
- [转]TortoiseSVN文件夹及文件图标不显示解决方法
FROM : http://blog.csdn.net/lishehe/article/details/8257545 由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的 ...
- Win7-其中的文件夹或文件已在另一个程序中打开
Win7-其中的文件夹或文件已在另一个程序中打开 如何解决Win7系统在删除或移动文件时提示,“操作无法完成,因为其中的文件夹或文件已在另一个程序中打开,请关闭该文件夹或文件,然后重试”. 步骤阅 ...
- TortoiseSVN文件夹及文件图标不显示解决方法(转发)
地址:http://blog.csdn.net/lishehe/article/details/8257545 由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能 ...
- TortoiseSVN文件夹及文件图标不显示解决方法 [转]
由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图 标,这个问题前一段时间就遇到了(那个时候没找到合适的答案 ...
随机推荐
- 安装openldap
在Mac OS X下安装 Mac OS X 下默认安装了openldap,我们只需要配置就可以. 1. 在/etc/openldap 下创建slapd.conf 文件(只需copy slapd.con ...
- eclipse中文字体大小修改,让中英文字体协调
貌似有不少人苦恼eclipse中文字体大小修改问题,默认的eclipse中文字体很小,和英文字体大小完全不在一个调子上,因为默认的eclipse juno中英文字体是Consolas,字体大小是10, ...
- Jersey 框架取到所有参数的方法
/** * 测试post取参数 * * @return */ @POST @Consumes("application/x-www-form-urlencoded") p ...
- tsort - 拓扑排序
tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572 (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...
- @JVM新一代的垃圾回收算法
垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...
- iOS:UITableViewCell自定义单元格
UITableViewCell:自定义的单元格,可以在xib中创建单元格,也可以在storyBorad中创建单元格.有四种创建方式 <1>在storyBorad中创建的单元格,它是静态的单 ...
- [19] 半球形(Hemisphere)图形的生成算法
顶点数据的生成 bool YfBuildHemisphereVertices ( Yreal radius, Yuint slices, Yuint stacks, YeOriginPose orig ...
- socket函数send和recv函数
转自:http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html 在发送端,一次发送4092个字节,在接收端,一次接收4092个字节,但是 ...
- 什么是C++虚函数、虚函数的作用和使用方法
我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例 ...
- CSS3中background属性的调整
CSS3对于background做了一些修改,最明显的一个就是采用设置多背景,不但添加了4个新属性,并且还对目前的属性进行了调整增强. 1.多个背景图片 在css3里面,你可以再一个标签元素里应用多个 ...