예제 #1
0
        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;
        }
예제 #2
0
        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;
        }