public FindInFileResult FindByLine(int startLine, string criteria) { const int queueBufferSize = 100; var result = new FindInFileResult{Criteria = criteria}; var lines = new StringBuilder(); var lineBuffer = new Queue<string>(queueBufferSize); int lineNumber = 1; using (var reader = new StreamReader(FilePath)) { string line; while (lineNumber < startLine) { if ((line = reader.ReadLine()) == null) return result; if (lineBuffer.Count == queueBufferSize) lineBuffer.Dequeue(); lineBuffer.Enqueue(line); lineNumber++; } while ((line = reader.ReadLine()) != null) { lineNumber++; if (lineBuffer.Count == queueBufferSize) lineBuffer.Dequeue(); lineBuffer.Enqueue(line); var charIndex = line.IndexOf(criteria, StringComparison.OrdinalIgnoreCase); if (charIndex > -1) { // we've found the criteria so return a string buffer // surrounding the result result.FoundAtLine = lineNumber; result.FoundAtCharIndex = charIndex; result.SurroundingTextStartLine = lineNumber; // take the last 5 lines from the buffer foreach (var l in lineBuffer.ToArray() .Skip(Math.Max(0, lineBuffer.Count - 5)) .Take(5)) { lines.AppendLine(l); result.SurroundingTextStartLine--; } lineNumber = 1; while ((line = reader.ReadLine()) != null && lineNumber < (queueBufferSize - 5)) { lines.AppendLine(line); lineNumber++; } break; } } } result.SurroundingText = lines.ToString(); return result; }
public FindInFileResult FindByPos(int startpos, string criteria) { var buffer = new byte[32768]; int filePos = 0; var result = new FindInFileResult {Criteria = criteria}; using (var file = File.OpenRead(FilePath)) { while (filePos < file.Length) { var bytesRead = file.Read(buffer, 0, buffer.Length); var content = Encoding.UTF8.GetString(buffer, 0, bytesRead); var criteriaIndex = content.IndexOf(criteria, StringComparison.OrdinalIgnoreCase); if (criteriaIndex > -1) { result.FoundAtBytePosition = filePos + criteriaIndex; file.Seek(-1024, SeekOrigin.Current); bytesRead = file.Read(buffer, 0, buffer.Length); result.SurroundingText = Encoding.UTF8.GetString(buffer, 0, bytesRead); break; } file.Seek(criteria.Length * -1, SeekOrigin.Current); filePos += (buffer.Length - criteria.Length); } } return result; }