Finder(文件内容搜索工具)

搜索文件夹内容的小工具

Github

两种搜索模式的算法:

BoyerMooreSearch.cs

using System.Threading;
using System.Collections.Generic;
using System.Linq;

namespace Finder.Algorithms
{
    /// <summary>
    /// An implemention of Boyer-Moore algorithm.
    /// <para/>author : Ornithopter
    /// </summary>
    class BoyerMooreSearch : SearchBase
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="source"></param>
        /// <param name="pattern"></param>
        /// <param name="token"></param>
        /// <returns>An array of matched index</returns>
        public int[] Search(string source, string pattern, CancellationToken token)
        {
            var matchIndexes = new List<int>();

            // step increasment.
            int delta;

            // prepare a map providing delta for each char in pattern string.
            var deltaMap = CreateDeltaMap(pattern);

            // start searching.
            for (var i = pattern.Length - 1; i < source.Length; i += delta)
            {
                token.ThrowIfCancellationRequested();
                // find next match and update delta.
                if (FindNext(source, pattern, i, deltaMap, token, out delta))
                {
                    // add to result list if found.
                    matchIndexes.Add(i - (pattern.Length - 1));
                }
            }
            return matchIndexes.ToArray();
        }

        private static bool Match(string source, int[] deltaMap, string pattern, CancellationToken token)
        {
            // step increasment.
            int delta;

            // start searching.
            for (var i = pattern.Length - 1; i < source.Length; i += delta)
            {
                token.ThrowIfCancellationRequested();
                // find next match and update delta.
                if (FindNext(source, pattern, i, deltaMap, token, out delta))
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// Find the next matched index and update delte at the same time.
        /// </summary>
        /// <param name="source"></param>
        /// <param name="pattern"></param>
        /// <param name="start"></param>
        /// <param name="deltaMap"></param>
        /// <param name="delta"></param>
        /// <returns>true if found one, otherwise false.</returns>
        private static bool FindNext(string source, string pattern, int start, int[] deltaMap, CancellationToken token, out int delta)
        {
            int i = pattern.Length - 1,
                index = 0;

            // start comparing from the last char in pattern.
            while (source[start - index] == pattern[i - index])
            {
                token.ThrowIfCancellationRequested();
                if (index != pattern.Length - 1)
                {
                    index++;
                }
                else
                {
                    // matchs to the end. So it‘s a search result.
                    delta = pattern.Length;
                    return true;
                }
            }

            // found one dismatched char at (start - index), get delta from map.
            var c = source[start - index];
            delta = /*c > 128 ? 0 : */deltaMap[c];

            if (delta == 0)
            {
                // this means the source[start] char is the last char in pattern
                // and only appears once. So delta should be the length of pattern.
                delta = pattern.Length;
            }
            return false;
        }

        static int[] CreateDeltaMap(string pattern)
        {
            const int alphabetSize = 0xffff;
            var patternLength = pattern.Length;
            var deltaMap = new int[alphabetSize];

            // initialize the map.
            for (var i = 0; i < alphabetSize; i++)
            {
                deltaMap[i] = patternLength;
            }

            // start from 0, which means any duplicated char will only have
            // the index nearest to the end.
            for (var i = 0; i < patternLength; i++)
            {
                var index = pattern[i];
                deltaMap[index] = patternLength - i - 1;
            }
            return deltaMap;
        }

        protected override void Build(CancellationToken token)
        {
            //throw new NotImplementedException();
        }

        public override string[] Search(string keyword, Dictionary<string, object> config, CancellationToken token)
        {
            var fileList = FileList;

            var deltaMap = CreateDeltaMap(keyword);

            return fileList.Where(filePath => Match(ReadContent(filePath), deltaMap, keyword, token)).ToArray();
        }
    }
}

Trie.cs

using System.Threading;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Finder.Algorithms
{
    class Trie : SearchBase
    {
        class Node
        {
            public Dictionary<char, Node> Next { get; private set; }
            public Dictionary<int, bool> FileIndex { get; private set; }

            public Node()
            {
                FileIndex = new Dictionary<int, bool>();
                Next = new Dictionary<char, Node>();
            }
        }

        private static readonly HashSet<char> Ignorance = new HashSet<char>
        {
            ‘[‘,
            ‘(‘,
            ‘{‘,
        };

        private static readonly HashSet<char> Spliters = new HashSet<char>
        {
            ‘ ‘,
            ‘,‘,
            ‘\n‘,
            ‘\r‘,
            ‘;‘,
            ‘]‘,
            ‘)‘,
            ‘}‘,
        };

        private Node _root;

        protected override void Build(CancellationToken token)
        {
            _root = new Node();

            var index = 0;
            foreach (var filePath in FileList)
            {
                token.ThrowIfCancellationRequested();
                Build(index++, ReadContent(filePath));
            }
        }

        private void Build(int fileIndex, string content)
        {
            var node = _root;
            foreach (var t in content)
            {
                var c = t;

                if (Ignorance.Contains(c))
                {
                    continue;
                }
                if (Spliters.Contains(c))
                {
                    node.FileIndex[fileIndex] = true;
                    node = _root;
                    continue;
                }

                /*if (!Char.IsLetter(c))
                    continue;*/

                if (Char.IsUpper(c))
                    c = Char.ToLower(c);

                Node next;
                if (!node.Next.TryGetValue(c, out next))
                {
                    next = new Node();
                    node.Next[c] = next;
                }
                node = next;
                node.FileIndex[fileIndex] = false;
            }
            node.FileIndex[fileIndex] = true;
        }

        private string[] Search(string keyword, bool matchWholeWord, CancellationToken token)
        {
            var node = _root;
            foreach (var t in keyword)
            {
                token.ThrowIfCancellationRequested();
                var c = t;
                if (Char.IsUpper(c))
                    c = Char.ToLower(c);

                Node next;
                if (!node.Next.TryGetValue(c, out next))
                {
                    return new string[0];
                }
                node = next;
            }

            if (matchWholeWord)
            {
                return node.FileIndex.Where(_ => _.Value).Select(_ => FileList[_.Key]).ToArray();
            }
            return node.FileIndex.Select(_ => FileList[_.Key]).ToArray();
        }

        public const string ConfigMatchWholeWord = "ConfigMatchWholeWord";

        public override string[] Search(string keyword, Dictionary<string, object> config, CancellationToken token)
        {
            var matchWholeWord = (bool)config[ConfigMatchWholeWord];
            return Search(keyword, matchWholeWord, token);
        }
    }
}

Finder(文件内容搜索工具)

时间: 2024-10-14 20:14:49

Finder(文件内容搜索工具)的相关文章

linux下grep文件内容搜索工具及基本正则表达式详解

grep命令: 根据模式(文本字符和基本正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:grep [选项] 匹配条件 文本名称 选项:  -i:  忽略大小写 -v: 显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串 --color: 搜索出来文件高亮度显示 -A: 匹配指定行的下几行 -B: 匹配指定行的上几行 -C: 匹配指定行的上下几行 -E: 扩展正则表达式 相当于egrep 正则表达式:Regular Expression, 简称REG

linux下egrep文件内容搜索工具及扩展正则表达式详解

egrep命令: 根据模式(文本字符和扩展正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:egrep [选项] 匹配条件 文本名称 egrep 等于 grep -E 选项:  -i:  忽略大小写 -v: 显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串 --color: 搜索出来文件高亮度显示 -A: 匹配指定行的下几行 -B: 匹配指定行的上几行 -C: 匹配指定行的上下几行 正则表达式:Regular Expression, 简称REGEX

文件与文档内容搜索工具软件

文件与文档内容搜索工具软件: 1.  Mythicsoft   https://mythicsoft.com/welcome 2.  Everything      - 电脑内文件搜索 3.文档大师又名"针式PKM"是一款功能强大.老牌的个人文档管理系统.   http://www.pinpkm.com/

文件内容检索工具

Java相关技术 - 文件内容检索工具 拿到一个几百M甚至上G的project让你去学习 有时候你会想知道某个关键词是在哪个文件里 比如:spring MVC配置的@RequestMapping,你从页面源知道了Action是 index/login.sftl 然后你想知道,这个@RequestMapping到底是配置在哪个Java类里,你怎么找到这个类呢 又比如,你想知道你当前看到的页面的源文件到底在项目的哪个路径下,你又要什么寻找 别告诉我,你会把项目里的文件一个个打开,直到找到你要的文件

文件处理工具 gif合成工具 文件后缀批量添加工具 文件夹搜索工具 重复文件查找工具 网页图片解析下载工具等

以下都是一些简单的免费分享的工具,技术支持群:592132877,提供定制化服务开发. Gif动图合成工具 主要功能是扫描指定的文件夹里的所有zip文件,然后提取Zip文件中的图片,并合成一张gif图片,存储到新的路径下,支持设置gif的时间,演示效果如下: 下载地址:gif合成工具 文件批量移动工具 主要功能是将指定文件夹及子文件夹里所有文件,复制到新的文件夹下,可以指定是否删除源文件.以下动图演示效果. 下载地址:文件批量移动工具.exe 文件批量移动工具 主要功能是将指定目录下所有文件按照

如何恢复XP/2003的文件内容搜索

如上面讲到的,Windows XP/2003的文件内容搜索并不是不能用,只是被关闭了而已,我们只要打开XP/2003的文件内容搜索的功能就可以了. 1.点击"开始" -> "运行". 2.输入"regedit",打开注册表编辑器.3.找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex中的"FilterFilesWithUnknownExtension

UltraCompare文件内容比较工具

http://www.52pojie.cn/thread-541895-1-1.html 云盘里有<ignore_js_op> <ignore_js_op> UltraCompare是一款文件内容比较工具.著名的ultraedit公司出品的,可进行文本模式,文件夹模式以及二进制模式的比较,并且可以对比较的文件进行合并,同步等操作,支持撤消操作.拥有书签与收藏夹功能,可以设置过滤,是一款比较出色的文件比较程序.你可以用它来比较两个文本文件的不同,也可以比较以二进制的模式比较两个EXE

文件快速搜索工具-Everything的使用(转)

首先它是一款基于名称实时定位文件和目录的搜索工具,有以下几个优点: 快速文件索引 快速文件搜索 较低资源占用 轻松分享文件索引 实时跟踪文件更新 通过使用everything小工具,可以提高我们的工作效率,更加方便我们查找文件. 想要对它有更多的了解,参考链接:http://xbeta.info/everything/faq.htm 下载链接:http://xbeta.info/everything/download.htm 主页面如下: 在搜索栏里输入我们想要查询的内容或者是文件的后缀,如ja

ubuntu 按照文件内容搜索文件

Linux查找文件内容的常用命令方法 从文件内容查找匹配指定字符串的行: $ grep "被查找的字符串" 文件名 例子:在当前目录里第一级文件夹中寻找包含指定字符串的.in文件 grep "thermcontact" /.in 从文件内容查找与正则表达式匹配的行: $ grep –e "正则表达式" 文件名 查找时不区分大小写: $ grep –i "被查找的字符串" 文件名 查找匹配的行数: $ grep -c "