/// <inheritdoc /> public ObservableCollection <LogEntry> ValueFor(Configuration configuration) { if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } var hashLogEntries = new ConcurrentBag <LogEntry>(); var result = new ObservableCollection <LogEntry>(); var currentHashAlgorithms = configuration.HashTypes; var includeExtensionList = new List <string>(); var excludeExtensionList = new List <string> { "ini", "db" }; excludeExtensionList.AddRange(currentHashAlgorithms); var includeFileNameList = new List <string>(); var excludeFileNameList = new List <string> { "folders2hash_log" }; var fileList = new ConcurrentBag <string>(); //true == directory, false == file Parallel.ForEach(configuration.PathsToScan, item => { if (item.Value) { fileList.AddRange(_filePath.GetFileList(item.Key, includeExtensionList, excludeExtensionList, includeFileNameList, excludeFileNameList).Distinct()); } else { fileList.Add(item.Key); } } ); Parallel.ForEach(currentHashAlgorithms, type => { Parallel.ForEach(fileList.Distinct(), file => { var hashFileName = _calculate.HashFileName(file, type, configuration.KeepFileExtension); var fileInfo = new FileInfo(file); var logEntry = new LogEntry { FileName = file, ShortFileName = fileInfo.Name, HashFileName = hashFileName, Type = type.ToUpper(), TimeStamp = DateTime.Now }; if (!File.Exists(hashFileName) || File.GetLastWriteTime(file) > File.GetLastWriteTime(hashFileName)) { var hashSum = _calculate.Hash(file, type); if (File.Exists(hashFileName)) { File.Delete(hashFileName); } logEntry.HashSum = hashSum; logEntry.AlreadyExisting = false; File.AppendAllText(hashFileName, hashSum); } else { logEntry.HashSum = File.ReadAllText(hashFileName).Trim(); logEntry.AlreadyExisting = true; } hashLogEntries.Add(logEntry); } ); } ); if (hashLogEntries.Any()) { if (hashLogEntries.Any(item => item != null && item.AlreadyExisting == false)) { result = new ObservableCollection <LogEntry>(hashLogEntries.Where(item => item != null && item.AlreadyExisting == false)); } _logging.RunFor(hashLogEntries, configuration); } return(result); }