Directory.EnumerateFiles(
@"C:\Path\To\Search\Directory\", // Target of search
"*.txt", // Specify file or files to search
SearchOption.AllDirectories).
// SearchOption.AllDirectories - recusively search subdirectories
// SearchOption.TopDirectoryOnly - search specified directory only
// Next line records a line of text, the line number, and the file
SelectMany(file => File.ReadAllLines(file).Select((text,n) => new {text,lineNumber=n+1,file})).
// Here we search the text
// Use Regex for the search OR use string methods Contains(), StartsWith, EndsWith ...
Where(line => Regex.IsMatch(line.text, @"Searching for this text", RegexOptions.IgnoreCase)
&& line.text.Contains("ERROR") ).
Dump("Matches found")
When debugging you can always use Skip() and Take() to reduce the number of lines searched.A similar one but this uses a LinqPad HyperLinq object to use Notepad++ to open the file at the given line number.
// https://npp-user-manual.org/docs/command-prompt/
var notepadppPath = @"C:\Program Files (x86)\Tools\Notepad++\notepad++.exe";
Directory.EnumerateFiles(
@"C:\Repos\", // Directory
"*.csproj", SearchOption.AllDirectories) // File names
.SelectMany(file => File.ReadAllLines(file).Select((text, n) =>
new
{
file = new Hyperlinq(() => Process.Start(notepadppPath,
file+" -n"+(n+1).ToString()), file),
lineNumber = n + 1,
text
}))
.Where(x => // WHat you are looking for in the file
// Regex.IsMatch(line.text, @"^.*tlpNotifySystemShutdown.*$"))
x.text.Contains("DownloadProcess.Contracts") // 1.0.1
|| x.text.Contains("Foobar.Client") // 13.15.0
|| x.text.Contains("DownloadProcess.Client") // 1.2.0
|| x.text.Contains("XxxZipCreator.") // 5.1.0
|| x.text.Contains("Sloopy.Crial.Messages") // 1.6.3
)
.Dump("Matches found");
Here is another example:
Directory.EnumerateFiles(
@"C:\Path\To\Search\Directory\",
"*.cs", SearchOption.AllDirectories)
.SelectMany(file => File.ReadAllLines(file).Select((text, n) => new { text, lineNumber = n + 1, file }))
.Where(line => line.text.Contains("[CallerMemberName"))
.Dump("Matches found")
No comments:
Post a Comment