zoukankan      html  css  js  c++  java
  • 一段超强的文本字符搜索代码(C#版本)

    最近在学习Asp.Net Core,github上下载了官方的示例文档AspNetCore.Docs,内容很多很杂,解压一下都得耗时3分钟,解压后有120MB。含有一万三千多个文件,近五千个文件夹。

    前两周在一个项目中看到过一段代码,有一句关于设置网站图标链接的,让网站不去请求favicon.ico图标(因为每次测试打开主页都会发起两次访问),今天想起来后想再去看一下,结果发现已经完全忘记是在哪个项目里看到的了。

    那就只能搜索关键字了。确定有<link rel="icon"  ... >其中有data,但是data前后是什么忘记了。

    现在事后找见了,先透露一下:在页面的 <head> 区域,加上如下代码实现屏蔽:<link rel="icon" href="data:;base64,="> 或者 <link rel="icon" href="data:,">

    我也没用过什么第三方搜索工具,都是直接用windows文件资源管理器搜索,输入要搜索的字符串,高级选项选中包含文件内容及搜索子文件夹。

    像上图那样,耗时三分钟,啥结果没有,猜测是不支持空格和引号之类的特殊字符。那就只搜索icon试试吧,两分钟过去,出来了不少结果。

    首先可以肯定是在后缀.cshtml文件中,当我费了一个小时把所有该类文件都打开看了一遍,结果眼花手酸,还是没找到,这个郁闷哪。

    试了一下第三方工具Everything,倒是很快,但是似乎只能搜索文件名,不能搜索文件内容。搜索框输入link rel="icon"后无任何结果。

    突然想起来以前在MSDN上看到过一段搜索文本字符的代码,当时只是测试其功能可正常运转,没有试过性能以及是否支持特殊字符,今天正好试一下。

    结果发现太TM强大了,一眨眼结果就出来了(真的1秒都不到),而且只需要40行代码,真的是震惊了!代码如下(我适当包装了一下,应该不需要解释):

     1 using System;
     2 using System.IO;
     3 using System.Linq;
     4 
     5 class Program
     6 {
     7     static void Main(string[] args)
     8     {
     9         SearchText(@"D:MyProgramCSharpASP.NET入门AspNetCore.Docsaspnetcore", "*.cshtml", "<link rel="icon"");   // 搜索文本可以没有<
    10     }
    11 
    12     static void SearchText(string searchPath, string searchFile, string searchText)    // 搜索文字不支持直接含有通配符
    13     {
    14         try
    15         {
    16             var files = from file in Directory.EnumerateFiles(searchPath, searchFile, SearchOption.AllDirectories)
    17                         from line in File.ReadLines(file)
    18                         where line.Contains(searchText)
    19                         select new
    20                         {
    21                             File = file,
    22                             Line = line
    23                         };
    24             foreach (var f in files)
    25             {
    26                 Console.WriteLine($"{f.File}  -->  {f.Line}");
    27             }
    28             Console.WriteLine($"{files.Count()} files found.");
    29         }
    30         catch (UnauthorizedAccessException uAEx)
    31         {
    32             Console.WriteLine(uAEx.Message);
    33         }
    34         catch (PathTooLongException pathEx)
    35         {
    36             Console.WriteLine(pathEx.Message);
    37         }
    38     }
    39 }
    40 
    41 // EnumerateFiles搜索字符串参数可以包含有效文本路径和通配符(*和?)的组合,但不支持正则表达式。

    结果如下:

    D:MyProgramCSharpASP.NET入门AspNetCore.Docsaspnetcorefundamentalserror-handlingsamples5.xErrorHandlingSamplePagesError.cshtml  -->      <link rel="icon" href="data:,">
    D:MyProgramCSharpASP.NET入门AspNetCore.Docsaspnetcorefundamentalserror-handlingsamples5.xErrorHandlingSamplePagesMyStatusCode.cshtml  -->      <link rel="icon" href="data:,">
    D:MyProgramCSharpASP.NET入门AspNetCore.Docsaspnetcorefundamentalserror-handlingsamples5.xErrorHandlingSamplePagesMyStatusCode2.cshtml  -->      <link rel="icon" href="data:,">
    3 files found.

    原来整个官方文档只有这一个项目有此设置,难怪我找起来困难了(判断失误,找了半天_Layout.cshtml文件)。其中Error.cshtml文件是这样的:


    你说强不强,不仅可以找到匹配的文件,而且连匹配的整行内容都找到了输出来方便你判断是否符合你的预期目标。

    这么强的代码,真的应该隆重介绍,按理说应该做成一个UI程序,不过由于时间精力有限顾不上弄了。

    后来我又看了一下上面的说的第三方工具Everything,发现也能搜索指定目录的指定文本,菜单“搜索->高级搜索”就可以,试了一下,耗时4-5秒,结果和我上面的代码相同(但只会显示找到的文件,想知道是否匹配你的目标还得一个个打开文件再搜索查看)。

    话说回来了,同样是巨硬,为什么windows的资源管理器做的那么烂呢。

    ——看完了文章,无论觉得写的不错的还是觉的辣鸡的,可以点赞或给点意见,鼓励或批评对我都很有用!
  • 相关阅读:
    jQuery碎语(1) 基础、选择要操作的元素、处理DOM元素
    C#位运算符的基本用法
    如何使用==操作符,Equals方法,ReferenceEquals方法,IEquatable接口比较2个对象
    C#实现ATM自动取款机
    如何使用C#关键字const,readonly,static
    用最简单的例子理解适配器模式(Adapter Pattern)
    前缀方式增1和后缀方式增1的区别
    抽象类可以有构造函数吗
    为什么使用抽象类,什么时候使用抽象类
    checked和unchecked的区别
  • 原文地址:https://www.cnblogs.com/chengyb/p/15088327.html
Copyright © 2011-2022 走看看