public async Task CopyFilesAsync(List.TaskInfo CurrentTask, CancellationToken cancellationToken) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PopulatingFileList)), new { AppName })); Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PopulatingFileList)), new { AppName })); var CopiedFiles = new List <string>(); var CreatedDirectories = new List <string>(); var AppFiles = GetFileList(); CurrentTask.TotalFileCount = AppFiles.Count; long TotalFileSize = 0; try { ParallelOptions POptions = new ParallelOptions() { CancellationToken = cancellationToken }; Parallel.ForEach(AppFiles, POptions, file => Interlocked.Add(ref TotalFileSize, file.Length)); CurrentTask.TotalFileSize = TotalFileSize; CurrentTask.ElapsedTime.Start(); LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileListPopulated)), new { AppName, FileCount = AppFiles.Count, TotalFileSize = Functions.FileSystem.FormatBytes(TotalFileSize) })); Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileListPopulated)), new { AppName, FileCount = AppFiles.Count, TotalFileSize = Functions.FileSystem.FormatBytes(TotalFileSize) })); // If the game is not compressed and user would like to compress it if (!IsCompressed && (CurrentTask.Compress || CurrentTask.TaskType == Enums.TaskType.Compress)) { FileInfo CompressedArchive = (CurrentTask.TaskType == Enums.TaskType.Compress) ? CompressedArchiveName : new FileInfo(CompressedArchiveName.FullName.Replace(Library.Steam.SteamAppsFolder.FullName, CurrentTask.TargetLibrary.Steam.SteamAppsFolder.FullName)); if (CompressedArchive.Exists) { while (CompressedArchive.IsFileLocked()) { Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.SteamAppInfo_CompressedArchiveExistsAndInUse)), new { ArchiveFullPath = CompressedArchive.FullName })); await Task.Delay(1000); } CompressedArchive.Delete(); } using (ZipArchive Archive = ZipFile.Open(CompressedArchive.FullName, ZipArchiveMode.Create)) { try { CopiedFiles.Add(CompressedArchive.FullName); foreach (FileSystemInfo currentFile in AppFiles) { CurrentTask.mre.WaitOne(); string FileNameInArchive = currentFile.FullName.Substring(Library.Steam.SteamAppsFolder.FullName.Length + 1); CurrentTask.TaskStatusInfo = Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_CompressingFile)), new { FileName = currentFile.Name, FormattedFileSize = Functions.FileSystem.FormatBytes(((FileInfo)currentFile).Length) }); Archive.CreateEntryFromFile(currentFile.FullName, FileNameInArchive, Properties.Settings.Default.CompressionLevel.ParseEnum <CompressionLevel>()); CurrentTask.MovedFileSize += ((FileInfo)currentFile).Length; if (CurrentTask.ReportFileMovement) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.SteamAppInfo_FileCompressed)), new { AppName, FileNameInArchive })); } Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.SteamAppInfo_FileCompressed)), new { AppName, FileNameInArchive })); if (cancellationToken.IsCancellationRequested) { throw new OperationCanceledException(cancellationToken); } } } catch (FileNotFoundException ex) { CurrentTask.ErrorHappened = true; Functions.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; await Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.CompressArchive_FileNotFoundEx)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Report(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.CompressArchive_FileNotFoundEx)), new { AppName, ExceptionMessage = ex.Message })); Logger.Fatal(ex); } } } // If the game is compressed and user would like to decompress it else if (IsCompressed && (!CurrentTask.Compress || CurrentTask.TaskType == Enums.TaskType.Compress)) { foreach (ZipArchiveEntry CurrentFile in ZipFile.OpenRead(CompressedArchiveName.FullName).Entries) { CurrentTask.mre.WaitOne(); FileInfo NewFile = new FileInfo(Path.Combine((CurrentTask.TaskType == Enums.TaskType.Compress) ? CurrentTask.SteamApp.Library.Steam.SteamAppsFolder.FullName : CurrentTask.TargetLibrary.Steam.SteamAppsFolder.FullName, CurrentFile.FullName)); if (!NewFile.Directory.Exists) { NewFile.Directory.Create(); CreatedDirectories.Add(NewFile.Directory.FullName); } CurrentTask.TaskStatusInfo = Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_Decompress)), new { NewFileName = NewFile.FullName, NewFileSize = Functions.FileSystem.FormatBytes(CurrentFile.Length) }); CurrentFile.ExtractToFile(NewFile.FullName, true); CopiedFiles.Add(NewFile.FullName); CurrentTask.MovedFileSize += CurrentFile.Length; if (CurrentTask.ReportFileMovement) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.SteamAppInfo_FileDecompressed)), new { AppName, NewFileFullPath = NewFile.FullName })); } Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.SteamAppInfo_FileDecompressed)), new { AppName, NewFileFullPath = NewFile.FullName })); if (cancellationToken.IsCancellationRequested) { throw new OperationCanceledException(cancellationToken); } } } // Everything else else { // Create directories Parallel.ForEach(AppFiles, POptions, CurrentFile => { var NewFile = new FileInfo(CurrentFile.FullName.Replace(Library.Steam.SteamAppsFolder.FullName, CurrentTask.TargetLibrary.Steam.SteamAppsFolder.FullName)); if (!NewFile.Directory.Exists) { NewFile.Directory.Create(); CreatedDirectories.Add(NewFile.Directory.FullName); } }); void CopyProgressCallback(FileProgress s) => OnFileProgress(s); POptions.MaxDegreeOfParallelism = 1; Parallel.ForEach(AppFiles.Where(x => (x).Length > Properties.Settings.Default.ParallelAfterSize * 1000000).OrderBy(x => x.DirectoryName).ThenByDescending(x => x.Length), POptions, CurrentFile => { try { var NewFile = new FileInfo(CurrentFile.FullName.Replace(Library.Steam.SteamAppsFolder.FullName, CurrentTask.TargetLibrary.Steam.SteamAppsFolder.FullName)); if (!NewFile.Exists || (NewFile.Length != CurrentFile.Length || NewFile.LastWriteTime != CurrentFile.LastWriteTime)) { FileCopier.CopyWithProgress(CurrentFile.FullName, NewFile.FullName, CopyProgressCallback); CurrentTask.MovedFileSize += CurrentFile.Length; NewFile.LastWriteTime = CurrentFile.LastWriteTime; NewFile.LastAccessTime = CurrentFile.LastAccessTime; NewFile.CreationTime = CurrentFile.CreationTime; } else { CurrentTask.MovedFileSize += NewFile.Length; } CopiedFiles.Add(NewFile.FullName); if (CurrentTask.ReportFileMovement) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } catch (System.ComponentModel.Win32Exception) { throw new OperationCanceledException(cancellationToken); } catch (PathTooLongException ex) { CurrentTask.ErrorHappened = true; Functions.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PathTooLongException)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Report(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); Logger.Fatal(ex); } catch (IOException ex) { CurrentTask.ErrorHappened = true; Functions.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError_DeleteMovedFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Report(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); Logger.Fatal(ex); } catch (UnauthorizedAccessException ex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FilePermissionRelatedError_DeleteFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); } }); POptions.MaxDegreeOfParallelism = Environment.ProcessorCount; Parallel.ForEach(AppFiles.Where(x => (x).Length <= Properties.Settings.Default.ParallelAfterSize * 1000000).OrderBy(x => x.DirectoryName).ThenByDescending(x => x.Length), POptions, CurrentFile => { try { if (cancellationToken.IsCancellationRequested) { throw (new OperationCanceledException(cancellationToken)); } CurrentTask.mre.WaitOne(); var NewFile = new FileInfo(CurrentFile.FullName.Replace(Library.Steam.SteamAppsFolder.FullName, CurrentTask.TargetLibrary.Steam.SteamAppsFolder.FullName)); if (!NewFile.Exists || (NewFile.Length != CurrentFile.Length || NewFile.LastWriteTime != CurrentFile.LastWriteTime)) { FileCopier.CopyWithProgress(CurrentFile.FullName, NewFile.FullName, CopyProgressCallback); CurrentTask.MovedFileSize += CurrentFile.Length; NewFile.LastWriteTime = CurrentFile.LastWriteTime; NewFile.LastAccessTime = CurrentFile.LastAccessTime; NewFile.CreationTime = CurrentFile.CreationTime; } else { CurrentTask.MovedFileSize += NewFile.Length; } CopiedFiles.Add(NewFile.FullName); if (CurrentTask.ReportFileMovement) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } catch (System.ComponentModel.Win32Exception) { throw new OperationCanceledException(cancellationToken); } catch (PathTooLongException ex) { CurrentTask.ErrorHappened = true; Functions.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PathTooLongException)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Report(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); Logger.Fatal(ex); } catch (IOException ex) { CurrentTask.ErrorHappened = true; Functions.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError_DeleteMovedFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Report(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); Logger.Fatal(ex); } catch (UnauthorizedAccessException ex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FilePermissionRelatedError_DeleteFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); } }); } CurrentTask.ElapsedTime.Stop(); CurrentTask.MovedFileSize = TotalFileSize; LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCompleted)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed, AverageSpeed = GetElapsedTimeAverage(TotalFileSize, CurrentTask.ElapsedTime.Elapsed.TotalSeconds), AverageFileSize = Functions.FileSystem.FormatBytes(TotalFileSize / (long)CurrentTask.TotalFileCount) })); Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCompleted)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed, AverageSpeed = GetElapsedTimeAverage(TotalFileSize, CurrentTask.ElapsedTime.Elapsed.TotalSeconds), AverageFileSize = Functions.FileSystem.FormatBytes(TotalFileSize / (long)CurrentTask.TotalFileCount) })); } catch (OperationCanceledException) { if (!CurrentTask.ErrorHappened) { CurrentTask.ErrorHappened = true; Functions.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; await Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCancelled_RemoveFiles)), new { AppName }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCancelled_ElapsedTime)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed })); Logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCancelled_ElapsedTime)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed })); } } catch (Exception ex) { CurrentTask.ErrorHappened = true; Functions.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; await Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.AnyException_RemoveFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Report(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.AnyError_ElapsedTime)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed })); Logger.Fatal(ex); } }
public async void CopyFilesAsync(List.TaskInfo CurrentTask, CancellationToken cancellationToken) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PopulatingFileList)), new { AppName })); logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PopulatingFileList)), new { AppName })); List <string> CopiedFiles = new List <string>(); List <string> CreatedDirectories = new List <string>(); List <FileInfo> AppFiles = GetFileList(); CurrentTask.TotalFileCount = AppFiles.Count; long TotalFileSize = 0; try { ParallelOptions POptions = new ParallelOptions() { CancellationToken = cancellationToken }; Parallel.ForEach(AppFiles, POptions, file => Interlocked.Add(ref TotalFileSize, file.Length)); CurrentTask.TotalFileSize = TotalFileSize; CurrentTask.ElapsedTime.Start(); LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileListPopulated)), new { AppName, FileCount = AppFiles.Count, TotalFileSize = Functions.FileSystem.FormatBytes(TotalFileSize) })); logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileListPopulated)), new { AppName, FileCount = AppFiles.Count, TotalFileSize = Functions.FileSystem.FormatBytes(TotalFileSize) })); if (CurrentTask.TargetLibrary.Type == Enums.LibraryType.SLM && CurrentTask.TargetLibrary.Origin == null) { Directory.CreateDirectory(Path.Combine(CurrentTask.TargetLibrary.DirectoryInfo.FullName, "Origin")); CurrentTask.TargetLibrary.Origin = new OriginLibrary(Path.Combine(CurrentTask.TargetLibrary.DirectoryInfo.FullName, "Origin")); } // Create directories Parallel.ForEach(AppFiles, POptions, CurrentFile => { FileInfo NewFile = new FileInfo(CurrentFile.FullName.Replace(Library.Origin.FullPath, CurrentTask.TargetLibrary.Origin.FullPath)); if (!NewFile.Directory.Exists) { NewFile.Directory.Create(); CreatedDirectories.Add(NewFile.Directory.FullName); } }); void CopyProgressCallback(FileProgress s) => OnFileProgress(s); POptions.MaxDegreeOfParallelism = 1; Parallel.ForEach(AppFiles.Where(x => (x).Length > Properties.Settings.Default.ParallelAfterSize * 1000000).OrderBy(x => x.DirectoryName).ThenByDescending(x => x.Length), POptions, CurrentFile => { try { FileInfo NewFile = new FileInfo(CurrentFile.FullName.Replace(Library.Origin.FullPath, CurrentTask.TargetLibrary.Origin.FullPath)); if (!NewFile.Exists || (NewFile.Length != CurrentFile.Length || NewFile.LastWriteTime != CurrentFile.LastWriteTime)) { FileCopier.CopyWithProgress(CurrentFile.FullName, NewFile.FullName, CopyProgressCallback); CurrentTask.MovedFileSize += CurrentFile.Length; NewFile.LastWriteTime = CurrentFile.LastWriteTime; NewFile.LastAccessTime = CurrentFile.LastAccessTime; NewFile.CreationTime = CurrentFile.CreationTime; } else { CurrentTask.MovedFileSize += NewFile.Length; } CopiedFiles.Add(NewFile.FullName); if (CurrentTask.ReportFileMovement) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } catch (System.ComponentModel.Win32Exception) { throw new OperationCanceledException(cancellationToken); } catch (PathTooLongException ex) { CurrentTask.ErrorHappened = true; Framework.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PathTooLongException)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); logger.Fatal(ex); } catch (IOException ex) { CurrentTask.ErrorHappened = true; Framework.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError_DeleteMovedFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); logger.Fatal(ex); SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } catch (UnauthorizedAccessException ex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FilePermissionRelatedError_DeleteFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); } }); POptions.MaxDegreeOfParallelism = Environment.ProcessorCount; Parallel.ForEach(AppFiles.Where(x => (x).Length <= Properties.Settings.Default.ParallelAfterSize * 1000000).OrderBy(x => x.DirectoryName).ThenByDescending(x => x.Length), POptions, CurrentFile => { try { if (cancellationToken.IsCancellationRequested) { throw (new OperationCanceledException(cancellationToken)); } CurrentTask.mre.WaitOne(); FileInfo NewFile = new FileInfo(CurrentFile.FullName.Replace(Library.Origin.FullPath, CurrentTask.TargetLibrary.Origin.FullPath)); if (!NewFile.Exists || (NewFile.Length != CurrentFile.Length || NewFile.LastWriteTime != CurrentFile.LastWriteTime)) { FileCopier.CopyWithProgress(CurrentFile.FullName, NewFile.FullName, CopyProgressCallback); CurrentTask.MovedFileSize += CurrentFile.Length; NewFile.LastWriteTime = CurrentFile.LastWriteTime; NewFile.LastAccessTime = CurrentFile.LastAccessTime; NewFile.CreationTime = CurrentFile.CreationTime; } else { CurrentTask.MovedFileSize += NewFile.Length; } CopiedFiles.Add(NewFile.FullName); if (CurrentTask.ReportFileMovement) { LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileMoved)), new { AppName, NewFileName = NewFile.FullName })); } catch (System.ComponentModel.Win32Exception) { throw new OperationCanceledException(cancellationToken); } catch (PathTooLongException ex) { CurrentTask.ErrorHappened = true; Framework.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.PathTooLongException)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); logger.Fatal(ex); } catch (IOException ex) { CurrentTask.ErrorHappened = true; Framework.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError_DeleteMovedFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FileSystemRelatedError)), new { AppName, ExceptionMessage = ex.Message })); logger.Fatal(ex); SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } catch (UnauthorizedAccessException ex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.FilePermissionRelatedError_DeleteFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); } }); CurrentTask.ElapsedTime.Stop(); CurrentTask.MovedFileSize = TotalFileSize; LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCompleted)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed, AverageSpeed = GetElapsedTimeAverage(TotalFileSize, CurrentTask.ElapsedTime.Elapsed.TotalSeconds), AverageFileSize = Functions.FileSystem.FormatBytes(TotalFileSize / (long)CurrentTask.TotalFileCount) })); logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCompleted)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed, AverageSpeed = GetElapsedTimeAverage(TotalFileSize, CurrentTask.ElapsedTime.Elapsed.TotalSeconds), AverageFileSize = Functions.FileSystem.FormatBytes(TotalFileSize / (long)CurrentTask.TotalFileCount) })); } catch (OperationCanceledException) { if (!CurrentTask.ErrorHappened) { CurrentTask.ErrorHappened = true; Framework.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; await Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCancelled_RemoveFiles)), new { AppName }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); LogToTM(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCancelled_ElapsedTime)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed })); logger.Info(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskCancelled_ElapsedTime)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed })); } } catch (Exception ex) { CurrentTask.ErrorHappened = true; Framework.TaskManager.Stop(); CurrentTask.Active = false; CurrentTask.Completed = true; await Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.RemoveMovedFiles)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.AnyException_RemoveFiles)), new { AppName, ExceptionMessage = ex.Message }), MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.AnyError_ElapsedTime)), new { AppName, ElapsedTime = CurrentTask.ElapsedTime.Elapsed })); logger.Fatal(ex); await SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } }