Salakhetdinov Shamil
mcp2004 at mail.ru
Tue Jun 19 15:14:56 CDT 2012
Hi All -- Here is a code snippet from my LINQPad utility code snippets collection to look for a text string in all the files of a directory (including subdirectories) I know there exists a grep (but I can't find it here on my system) utility or windows explorer advanced search but the sample code (see P.S.) seems to be working much quicker(?), also this code snippets is not a bad example of modern C# development techniques - try: Here are the results for my real life case - I have just needed to find a text in 3765 .cs files. 1. first run took 30 seconds start: 19.06.2012 23:36:06 end: 19.06.2012 23:36:34 2. subsequent runs Total files count 3765 Start Time 19.06.2012 23:59:39 e:\projects\code\TestSolution\Test.BLL\Reports Import\TestApiAgent.cs e:\projects\code\TestSolution\Test.Core\Settings\General Settings\GeneralSettings.cs Total files length 39905062 End Time 19.06.2012 23:59:42 Elapsed time (ms) 2483.1421 Processing speed (chars/ms) 16070.3900111073 Thank you. -- Shamil P.S. Code snippet // Search for a text string in all the *.cs files of a directory // including its subdirectories // // folder to search code files in string folderName = @"e:\projects\code"; // search string string searchFor = "test.com"; var folder = new System.IO.DirectoryInfo(folderName); var files = folder.GetFiles("*.cs", SearchOption.AllDirectories); files.Length.Dump("Total files count"); var startTime = DateTime.Now; startTime.Dump("Start Time"); int totalLength = 0; files.AsParallel().ForAll(x => { Interlocked.Add(ref totalLength, (int)(new System.IO.FileInfo(x.FullName)).Length); string code = System.IO.File.ReadAllText(x.FullName, Encoding.UTF8); if (code.IndexOf(searchFor,StringComparison.InvariantCultureIgnoreCase)>-1) System.Console.WriteLine(x.FullName); }); totalLength.Dump("Total files length"); var endTime = DateTime.Now; endTime.Dump("End Time"); (endTime - startTime).TotalMilliseconds.Dump("Elapsed time (ms)"); (totalLength / (endTime - startTime).TotalMilliseconds).Dump("Processing speed (chars/ms)");