private void WatchDirectory() { ColorConsole.Yellow("Watch directory"); var allFiles = Directory.GetFiles(logsPath); var newFiles = allFiles.Except(logFileRepository.GetFiles().Select(x => x.Path)).ToArray(); if (!newFiles.Any() && !_isThereFileInQueue) { if (allFiles.Length != 0 && allFiles.Last() != _lastFile) { _lastFile = allFiles.Length > 0 ? allFiles.Last() : _lastFile; var logFile = logFileRepository.GetFileByName(_lastFile); _skip = logFile.ReadBytes; ReadLinesFromFile(); } return; } ColorConsole.Yellow("There are new files or there is file in queue"); foreach (var file in newFiles) { var lines = new List <string>(); long position; using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var streamReader = new StreamReader(fileStream)) { streamReader.BaseStream.Seek(0, SeekOrigin.Begin); while (streamReader.Peek() >= 0) { lines.Add(streamReader.ReadLine()); } position = streamReader.BaseStream.Length; } } _skip = position; var logs = parsers.ParseLogs(lines.ToList()); if (logs != null) { ColorConsole.Yellow($"{logs.Count} logs will be added"); ColorConsole.Yellow($"Last read lines is {lines.Last()}"); logRepository.InsertBatch(logs); } logFileRepository.AddFile(new LogFile { Path = file, ReadBytes = position }); _isThereFileInQueue = true; } if (newFiles.Length != 0 && _lastFile != newFiles.Last() || _isThereFileInQueue) { _lastFile = newFiles.Length > 0 ? newFiles.Last() : _lastFile; ReadLinesFromFile(); } }