一段超强的文本字符搜索代码(C#版本)
作者:互联网
最近在学习Asp.Net Core,github上下载了官方的示例文档AspNetCore.Docs,内容很多很杂,解压一下都得耗时3分钟,解压后有120MB。含有一万三千多个文件,近五千个文件夹。
前两周在一个项目中看到过一段代码,有一句关于设置网站图标链接的,让网站不去请求favicon.ico图标(因为每次测试打开主页都会发起两次访问),今天想起来后想再去看一下,结果发现已经完全忘记是在哪个项目里看到的了。
那就只能搜索关键字了。确定有<link rel="icon" ... >其中有data,但是data前后是什么忘记了。
现在事后找见了,先透露一下:在页面的 <head> 区域,加上如下代码实现屏蔽:<link rel="icon" href="data:;base64,=">
我也没用过什么第三方搜索工具,都是直接用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:\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的资源管理器做的那么烂呢。
标签:C#,Docs,AspNetCore,cshtml,CSharp,搜索,超强,文本,代码 来源: https://www.cnblogs.com/chengyb/p/15088327.html