一段超强的文本字符搜索代码(C#版本)

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

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

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

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

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

一段超强的文本字符搜索代码(C#版本)

像上图那样,耗时三分钟,啥结果没有,猜测是不支持空格和引号之类的特殊字符。那就只搜索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:\MyProgram\CSharp\ASP.NET入门\AspNetCore.Docs\aspnetcore", "*.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:\MyProgram\CSharp\ASP.NET入门\AspNetCore.Docs\aspnetcore\fundamentals\error-handling\samples\5.x\ErrorHandlingSample\Pages\Error.cshtml  -->      <link rel="icon" href="data:,">
D:\MyProgram\CSharp\ASP.NET入门\AspNetCore.Docs\aspnetcore\fundamentals\error-handling\samples\5.x\ErrorHandlingSample\Pages\MyStatusCode.cshtml  -->      <link rel="icon" href="data:,">
D:\MyProgram\CSharp\ASP.NET入门\AspNetCore.Docs\aspnetcore\fundamentals\error-handling\samples\5.x\ErrorHandlingSample\Pages\MyStatusCode2.cshtml  -->      <link rel="icon" href="data:,">
3 files found.

原来整个官方文档只有这一个项目有此设置,难怪我找起来困难了。你说强不强,不仅可以找到匹配的文件,而且连匹配的整行内容都找到了输出来方便你判断是否合适。

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

后来我又看了一下上面的说的第三方工具Everything,发现也能搜索指定目录的指定文本,菜单“搜索->高级搜索”就可以,试了一下,耗时4-5秒,结果和我上面的代码相同。

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

 

上一篇:软件工程(FZU2015) 赛季得分榜,第八回合


下一篇:20192327 2020-2021-1 《数据结构与面向对象程序设计》实验八报告