private void ProcessChangesIfAny() { lock (DedupLock) { if (NewFiles.Any() || DeletedFiles.Any()) { DedupTask = Task.Factory.StartNew( ProcessChanges, CancelSource.Token); return; } if (!CurrentState.Settings.MonitorChanges) { operationStartTime = DateTime.MinValue; OnOperationUpdate( OperationType.Completed, ProgressStyle.NoProgress); OnLogged("Finished comparison."); return; } operationStartTime = DateTime.Now; OnOperationUpdate( OperationType.Monitoring, ProgressStyle.Marquee); OnLogged("Monitoring for file changes..."); return; } }
private void ProcessChanges() { var cancelToken = CancelSource.Token; while (DeletedFiles.Any()) { var deletedFile = DeletedFiles.First().Key; _ = DeletedFiles.TryRemove(deletedFile, out var _); if (CurrentState.VideoFiles.Remove(deletedFile)) { CurrentState.SaveState(); OnLogged($"Removed file: {deletedFile.FilePath}"); } else { OnLogged($"Deleted file not in VideoFile-List: " + $"{deletedFile.FilePath}"); } cancelToken.ThrowIfCancellationRequested(); } operationStartTime = DateTime.Now; OnOperationUpdate(OperationType.Comparing, 0, NewFiles.Count()); // We need to count for the ProgressUpdate since we shrink // the Queue on every iteration. var filesProcessed = 1; while (NewFiles.Any()) { var newFile = NewFiles.First().Key; _ = NewFiles.TryRemove(newFile, out var _); OnOperationUpdate(OperationType.Comparing, filesProcessed, filesProcessed + NewFiles.Count()); filesProcessed++; if (!newFile.WaitForFileAccess(cancelToken)) { OnLogged($"Unable to access new file: {newFile.FileName}"); cancelToken.ThrowIfCancellationRequested(); continue; } cancelToken.ThrowIfCancellationRequested(); if (newFile.Duration == TimeSpan.Zero) { OnLogged($"New file has no duration: {newFile.FilePath}"); continue; } cancelToken.ThrowIfCancellationRequested(); if (!CurrentState.VideoFiles.Contains(newFile)) { OnLogged($"New file added to VideoFile-List: {newFile.FilePath}"); CurrentState.VideoFiles.Add(newFile); } else { OnLogged($"New file already in VideoFile-List: {newFile.FilePath}"); continue; } cancelToken.ThrowIfCancellationRequested(); FindDuplicatesOf(CurrentState.VideoFiles, newFile, cancelToken); CurrentState.SaveState(); // Cleanup in case of cancel foreach (var file in CurrentState.VideoFiles) { file.DisposeImages(); } cancelToken.ThrowIfCancellationRequested(); } ProcessChangesIfAny(); }