private List <ProcessFileInfo> SelectFiles(SourceConfiguration sourceConfig, IMediaQueue mediaQueue) { mediaQueue.ReportProgress($"Selecting {(m_recursive ? "from" : "tree")}: {m_path}"); // Determine the "after" threshold from SelectAfter and SelectIncremental var after = sourceConfig.GetBookmarkOrAfter(m_path); m_newestSelection = after ?? DateTime.MinValue; var queue = new List <ProcessFileInfo>(); int skippedFiles = 0; try { DirectoryInfo di = new DirectoryInfo(m_directory); foreach (var fi in di.EnumerateFiles(m_pattern, m_recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)) { if (((queue.Count + skippedFiles) % 100) == 0) { string message = (skippedFiles == 0) ? $"Selected: {queue.Count}" : $"Selected: {queue.Count} Not Selected: {skippedFiles}"; mediaQueue.ReportStatus(message); } if (MediaFile.IsSupportedMediaType(fi.Extension)) { // Limit date window of files to be selected if (after.HasValue) { var date = MediaFile.GetBookmarkDate(fi.FullName); if (!date.HasValue || date.Value <= after.Value) { ++skippedFiles; continue; } // For this operation, we do everything in localtime because photo // DateTaken metadata is in localtime. // This is after-the-fact but since it's a debugging test that's OK. Debug.Assert(date.Value.Kind == DateTimeKind.Local); if (m_newestSelection < date.Value) { m_newestSelection = date.Value; } } queue.Add(new ProcessFileInfo(fi)); } } } catch (Exception err) { throw new ArgumentException($"Source '{m_path}' not found. ({err.Message})", err); } mediaQueue.ReportStatus(null); mediaQueue.ReportProgress(skippedFiles == 0 ? $" Selected: {queue.Count}" : $" Selected: {queue.Count} Not Selected: {skippedFiles}"); // If SelectIncremental, report the new bookmark if (sourceConfig.SelectIncremental && queue.Count > 0) { Debug.Assert(m_newestSelection > DateTime.MinValue); mediaQueue.ReportProgress($" Newest: {m_newestSelection:yyyy'-'MM'-'dd' 'HH':'mm':'ss}"); } return(queue); }