public virtual async Task <bool> DeleteFilesAsync(List.TaskInfo currentTask = null) { try { Parallel.ForEach(GetFileList(), currentFile => { try { currentTask?.mre.WaitOne(); currentFile.Refresh(); if (!currentFile.Exists) { return; } if (currentTask != null) { currentTask.mre.WaitOne(); currentTask.TaskStatusInfo = Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_DeletingFile)), new { FileName = currentFile.Name, FormattedFileSize = Functions.FileSystem.FormatBytes(currentFile.Length) }); if (currentTask.ReportFileMovement) { ReportToTaskManager($"[{DateTime.Now}] [{AppName}] {Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_DeletingFile)), new { FileName = currentFile.Name, FormattedFileSize = Functions.FileSystem.FormatBytes(currentFile.Length) })}"); } } System.IO.File.SetAttributes(currentFile.FullName, System.IO.FileAttributes.Normal); currentFile.Delete(); } catch (Exception ex) { Logger.Fatal(ex); } }); InstallationDirectory.Refresh(); if (InstallationDirectory.Exists) { await Task.Run(() => InstallationDirectory.Delete(true)); } return(true); } catch (Exception ex) { Logger.Error(ex); return(false); } }
public void DeleteFiles(List.TaskInfo CurrentTask = null) { try { var Files = GetFileList(); Parallel.ForEach(Files, currentFile => { try { CurrentTask?.mre.WaitOne(); currentFile.Refresh(); if (currentFile.Exists) { if (CurrentTask != null) { CurrentTask.mre.WaitOne(); CurrentTask.TaskStatusInfo = $"Deleting: {currentFile.Name} ({Functions.FileSystem.FormatBytes(currentFile.Length)})"; Main.FormAccessor.TaskManager_Logs.Add($"[{DateTime.Now}] [{CurrentTask.OriginApp.AppName}] Deleting file: {currentFile.FullName}"); } File.SetAttributes(currentFile.FullName, FileAttributes.Normal); currentFile.Delete(); } } catch (Exception ex) { logger.Fatal(ex); } }); InstallationDirectory.Refresh(); if (InstallationDirectory.Exists) { InstallationDirectory.Delete(true); } } catch { } }
public void DeleteFiles(List.TaskInfo CurrentTask = null) { try { Parallel.ForEach(GetFileList(), currentFile => { try { CurrentTask?.mre.WaitOne(); currentFile.Refresh(); if (currentFile.Exists) { if (CurrentTask != null) { CurrentTask.mre.WaitOne(); CurrentTask.TaskStatusInfo = Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_DeletingFile)), new { FileName = currentFile.Name, FormattedFileSize = Functions.FileSystem.FormatBytes(currentFile.Length) }); Main.FormAccessor.TaskManager_Logs.Add($"[{DateTime.Now}] [{AppName}] {Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_DeletingFile)), new { FileName = currentFile.Name, FormattedFileSize = Functions.FileSystem.FormatBytes(currentFile.Length) })}"); } File.SetAttributes(currentFile.FullName, FileAttributes.Normal); currentFile.Delete(); } } catch (Exception ex) { logger.Fatal(ex); } }); InstallationDirectory.Refresh(); if (InstallationDirectory.Exists) { InstallationDirectory.Delete(true); } } catch { } }
public async Task <bool> DeleteFilesAsync(List.TaskInfo CurrentTask = null) { try { if (IsCompressed) { CompressedArchiveName.Refresh(); if (CompressedArchiveName.Exists) { await Task.Run(() => CompressedArchiveName.Delete()); } } else { List <FileInfo> FileList = GetFileList(); if (FileList.Count > 0) { Parallel.ForEach(FileList, currentFile => { try { CurrentTask?.mre.WaitOne(); currentFile.Refresh(); if (currentFile.Exists) { if (CurrentTask != null) { CurrentTask.mre.WaitOne(); CurrentTask.TaskStatusInfo = Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_DeletingFile)), new { FileName = currentFile.Name, FormattedFileSize = Functions.FileSystem.FormatBytes(currentFile.Length) }); if (CurrentTask.ReportFileMovement) { Main.FormAccessor.TaskManager_Logs.Report($"[{DateTime.Now}] [{AppName}] {Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.TaskStatus_DeletingFile)), new { FileName = currentFile.Name, FormattedFileSize = Functions.FileSystem.FormatBytes(currentFile.Length) })}"); } } File.SetAttributes(currentFile.FullName, FileAttributes.Normal); currentFile.Delete(); } } catch (Exception ex) { Logger.Fatal(ex); } } ); } CommonFolder.Refresh(); // common folder, if exists if (CommonFolder.Exists) { await Task.Run(() => CommonFolder.Delete(true)); } DownloadFolder.Refresh(); // downloading folder, if exists if (DownloadFolder.Exists) { await Task.Run(() => DownloadFolder.Delete(true)); } WorkShopPath.Refresh(); // workshop folder, if exists if (WorkShopPath.Exists) { await Task.Run(() => WorkShopPath.Delete(true)); } FullAcfPath.Refresh(); // game .acf file if (FullAcfPath.Exists) { File.SetAttributes(FullAcfPath.FullName, FileAttributes.Normal); FullAcfPath.Delete(); } WorkShopAcfPath.Refresh(); // workshop .acf file if (WorkShopAcfPath.Exists) { File.SetAttributes(WorkShopAcfPath.FullName, FileAttributes.Normal); WorkShopAcfPath.Delete(); } if (CurrentTask != null) { CurrentTask.TaskStatusInfo = ""; } } return(true); } catch (FileNotFoundException ex) { Logger.Error(ex); return(true); } catch (DirectoryNotFoundException ex) { Logger.Error(ex); return(true); } catch (IOException ex) { Logger.Error(ex); return(true); } catch (UnauthorizedAccessException ex) { Logger.Error(ex); return(true); } catch (Exception ex) { MessageBox.Show(ex.ToString()); Logger.Fatal(ex); return(false); } }
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 Task CompactTask(List.TaskInfo currentTask, CancellationToken cancellationToken) { try { /* * Syntax * compact [{/c|/u}] [/s[:dir]] [/a] [/i] [/f] [/q] [FileName[...]] * * Parameters * * /c : Compresses the specified directory or file. * /u : Uncompresses the specified directory or file. * /s : dir : Specifies that the requested action (compress or uncompress) be applied to all subdirectories of the specified directory, or of the current directory if none is specified. * /a : Displays hidden or system files. * /i : Ignores errors. * /f : Forces compression or uncompression of the specified directory or file. This is used in the case of a file that was partly compressed when the operation was interrupted by a system crash. To force the file to be compressed in its entirety, use the /c and /f parameters and specify the partially compressed file. * /q : Reports only the most essential information. * FileName : Specifies the file or directory. You can use multiple file names and wildcard characters (* and ?). * /? : Displays help at the command prompt. */ LogToTM($"Current status of {AppName} is {(IsCompacted ? "compressed" : "not compressed")} and the task is set to {(currentTask.Compact ? "compress" : "uncompress")} the app."); currentTask.ElapsedTime.Start(); currentTask.mre.WaitOne(); var result = await Cli.Wrap("compact") .SetArguments($"{(currentTask.Compact ? "/c" : "/u")} /i /q {(currentTask.ForceCompact ? "/f" : "")} /EXE:{currentTask.CompactLevel} /s") .SetWorkingDirectory(CommonFolder.FullName) .SetCancellationToken(cancellationToken) .SetStandardOutputCallback(OnCompactFolderProgress) .SetStandardErrorCallback(OnCompactFolderProgress) .EnableStandardErrorValidation() .ExecuteAsync().ConfigureAwait(false); var exitCode = result.ExitCode; var stdErr = result.StandardError; var runTime = result.RunTime; LogToTM(string.IsNullOrEmpty(stdErr) ? $"[{AppName}] Task completed in {runTime} - ExitCode: {exitCode}" : $"[{AppName}] Task failed with error message: {stdErr} - ExitCode: {exitCode}"); currentTask.ElapsedTime.Stop(); IsCompacted = CompactStatus(); } catch (OperationCanceledException) { if (!currentTask.ErrorHappened) { currentTask.ErrorHappened = true; Functions.TaskManager.Stop(); currentTask.Active = false; currentTask.Completed = true; 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) { LogToTM(ex.ToString()); Debug.WriteLine(ex); } }
public async Task <bool> DeleteFilesAsync(List.TaskInfo CurrentTask = null) { try { if (IsCompressed) { CompressedArchiveName.Refresh(); if (CompressedArchiveName.Exists) { await Task.Run(() => CompressedArchiveName.Delete()); } } else { List <FileInfo> FileList = GetFileList(); if (FileList.Count > 0) { Parallel.ForEach(FileList, currentFile => { try { CurrentTask?.mre.WaitOne(); currentFile.Refresh(); if (currentFile.Exists) { if (CurrentTask != null) { CurrentTask.mre.WaitOne(); CurrentTask.TaskStatusInfo = $"Deleting: {currentFile.Name} ({Functions.FileSystem.FormatBytes(currentFile.Length)})"; Main.FormAccessor.TaskManager_Logs.Add($"[{DateTime.Now}] [{CurrentTask.SteamApp.AppName}] Deleting file: {currentFile.FullName}"); } File.SetAttributes(currentFile.FullName, FileAttributes.Normal); currentFile.Delete(); } } catch (Exception ex) { logger.Fatal(ex); } } ); } CommonFolder.Refresh(); // common folder, if exists if (CommonFolder.Exists) { await Task.Run(() => CommonFolder.Delete(true)); } DownloadFolder.Refresh(); // downloading folder, if exists if (DownloadFolder.Exists) { await Task.Run(() => DownloadFolder.Delete(true)); } WorkShopPath.Refresh(); // workshop folder, if exists if (WorkShopPath.Exists) { await Task.Run(() => WorkShopPath.Delete(true)); } FullAcfPath.Refresh(); // game .acf file if (FullAcfPath.Exists) { File.SetAttributes(FullAcfPath.FullName, FileAttributes.Normal); FullAcfPath.Delete(); } WorkShopAcfPath.Refresh(); // workshop .acf file if (WorkShopAcfPath.Exists) { File.SetAttributes(WorkShopAcfPath.FullName, FileAttributes.Normal); WorkShopAcfPath.Delete(); } if (CurrentTask != null) { CurrentTask.TaskStatusInfo = ""; } } return(true); } catch (FileNotFoundException ex) { logger.Error(ex); return(true); } catch (DirectoryNotFoundException ex) { logger.Error(ex); return(true); } catch (IOException ex) { logger.Error(ex); return(true); } catch (UnauthorizedAccessException ex) { logger.Error(ex); return(true); } catch (Exception ex) { MessageBox.Show(ex.ToString()); logger.Fatal(ex); await SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); return(false); } }
public async Task CopyFilesAsync(List.TaskInfo CurrentTask, CancellationToken cancellationToken) { LogToTM($"[{AppName}] Populating file list, please wait"); logger.Info("Populating file list for: {0}", 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($"[{AppName}] File list populated, total files to move: {AppFiles.Count} - total size to move: {Functions.FileSystem.FormatBytes(TotalFileSize)}"); logger.Info("File list populated, total files to move: {0} - total size to move: {1}", AppFiles.Count, 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($"{CompressedArchive.FullName} is in use. Delaying the task until archive gets free."); 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 = $"Compressing: {currentFile.Name} ({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($"[{AppName}] Compressed file: {FileNameInArchive}"); } logger.Info("Compressed file: {0}", FileNameInArchive); if (cancellationToken.IsCancellationRequested) { throw new OperationCanceledException(cancellationToken); } } } catch (FileNotFoundException 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("Remove moved files?", $"[{AppName}] An error releated to file system is happened while compressing files.\n\nError: {ex.Message}.\n\nWould you like to remove archive file that is generated by SLM?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error releated to file system is happened while compressing files. Error: {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 = $"Decompressing: {NewFile.Name} ({Functions.FileSystem.FormatBytes(CurrentFile.Length)})"; CurrentFile.ExtractToFile(NewFile.FullName, true); CopiedFiles.Add(NewFile.FullName); CurrentTask.MovedFileSize += CurrentFile.Length; if (CurrentTask.ReportFileMovement) { LogToTM($"[{AppName}] Decompressed file: {NewFile.FullName}"); } logger.Info("Decompressed file: {0}", NewFile.FullName); if (cancellationToken.IsCancellationRequested) { throw new OperationCanceledException(cancellationToken); } } } // Everything else else { POptions.MaxDegreeOfParallelism = 1; Parallel.ForEach(AppFiles.Where(x => (x).Length > Properties.Settings.Default.ParallelAfterSize * 1000000).OrderByDescending(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)) { if (!NewFile.Directory.Exists) { NewFile.Directory.Create(); CreatedDirectories.Add(NewFile.Directory.FullName); } int currentBlockSize = 0; byte[] FSBuffer = new byte[4096]; using (FileStream CurrentFileContent = CurrentFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (FileStream NewFileContent = NewFile.OpenWrite()) { CurrentTask.TaskStatusInfo = $"Copying: {CurrentFile.Name} ({Functions.FileSystem.FormatBytes(CurrentFile.Length)})"; while ((currentBlockSize = CurrentFileContent.Read(FSBuffer, 0, FSBuffer.Length)) > 0) { if (cancellationToken.IsCancellationRequested) { throw (new OperationCanceledException(cancellationToken)); } CurrentTask.mre.WaitOne(); NewFileContent.Write(FSBuffer, 0, currentBlockSize); CurrentTask.MovedFileSize += currentBlockSize; } } 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($"[{AppName}] File moved: {NewFile.FullName}"); } logger.Info("File moved: {0}", NewFile.FullName); } 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("Remove moved files?", $"[{AppName}] PathTooLongException happened while copying files. Nothing can be made by SLM in this error.\n\nError: {ex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error releated to file system is happened while moving files. Error: {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("Remove moved files?", $"[{AppName}] An error releated to file system is happened while moving files.\n\nError: {ex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error releated to file system is happened while moving files. Error: {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("Remove moved files?", $"[{AppName}] An error releated to file permissions happened during file movement. Running SLM as Administrator might help.\n\nError: {ex.Message}.\n\nWould you like to remove files that already moved from target library?", 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).OrderByDescending(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)) { CurrentTask.TaskStatusInfo = $"Copying: {CurrentFile.Name} ({Functions.FileSystem.FormatBytes(CurrentFile.Length)})"; if (!NewFile.Directory.Exists) { NewFile.Directory.Create(); CreatedDirectories.Add(NewFile.Directory.FullName); } int currentBlockSize = 0; byte[] FSBuffer = new byte[4096]; using (FileStream CurrentFileContent = CurrentFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (FileStream NewFileContent = NewFile.Create()) { while ((currentBlockSize = CurrentFileContent.Read(FSBuffer, 0, FSBuffer.Length)) > 0) { NewFileContent.Write(FSBuffer, 0, currentBlockSize); CurrentTask.MovedFileSize += currentBlockSize; } } 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($"[{AppName}] File moved: {NewFile.FullName}"); } logger.Info("File moved: {0}", NewFile.FullName); } 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("Remove moved files?", $"[{AppName}] PathTooLongException happened while copying files. Nothing can be made by SLM in this error.\n\nError: {ex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error releated to file system is happened while moving files. Error: {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("Remove moved files?", $"[{AppName}] An error releated to file system is happened while moving files.\n\nError: {ex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error releated to file system is happened while moving files. Error: {ex.Message}."); logger.Fatal(ex); SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } catch (UnauthorizedAccessException uaex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync("Remove moved files?", $"[{AppName}] An error releated to file permissions happened during file movement. Running SLM as Administrator might help.\n\nError: {uaex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); } }); } CurrentTask.ElapsedTime.Stop(); CurrentTask.MovedFileSize = TotalFileSize; LogToTM($"[{AppName}] Time elapsed: {CurrentTask.ElapsedTime.Elapsed} - Average speed: {GetElapsedTimeAverage(TotalFileSize, CurrentTask.ElapsedTime.Elapsed.TotalSeconds)} MB/sec - Average file size: {Functions.FileSystem.FormatBytes(TotalFileSize / (long)CurrentTask.TotalFileCount)}"); logger.Info("Movement completed in {0} with Average Speed of {1} MB/sec - Average file size: {2}", CurrentTask.ElapsedTime.Elapsed, GetElapsedTimeAverage(TotalFileSize, CurrentTask.ElapsedTime.Elapsed.TotalSeconds), 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("Remove moved files?", $"[{AppName}] Game movement cancelled. Would you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); LogToTM($"[{AppName}] Operation cancelled by user. Time Elapsed: {CurrentTask.ElapsedTime.Elapsed}"); logger.Info("Operation cancelled by used. Elapsed time: {0}", 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("Remove moved files?", $"[{AppName}] An error happened while moving game files. Would you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error happened while moving game files. Time Elapsed: {CurrentTask.ElapsedTime.Elapsed}"); logger.Fatal(ex); await SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } }
public async void CopyFilesAsync(List.TaskInfo CurrentTask, CancellationToken cancellationToken) { LogToTM($"[{AppName}] Populating file list, please wait"); logger.Info("Populating file list for: {0}", 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($"[{AppName}] File list populated, total files to move: {AppFiles.Count} - total size to move: {Functions.FileSystem.FormatBytes(TotalFileSize)}"); logger.Info("File list populated, total files to move: {0} - total size to move: {1}", AppFiles.Count, Functions.FileSystem.FormatBytes(TotalFileSize)); POptions.MaxDegreeOfParallelism = 1; 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")); } Parallel.ForEach(AppFiles.Where(x => (x).Length > Properties.Settings.Default.ParallelAfterSize * 1000000).OrderByDescending(x => (x).Length), POptions, CurrentFile => { try { 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)) { if (!NewFile.Directory.Exists) { NewFile.Directory.Create(); CreatedDirectories.Add(NewFile.Directory.FullName); } int currentBlockSize = 0; byte[] FSBuffer = new byte[4096]; using (FileStream CurrentFileContent = CurrentFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (FileStream NewFileContent = NewFile.OpenWrite()) { CurrentTask.TaskStatusInfo = $"Copying: {CurrentFile.Name} ({Functions.FileSystem.FormatBytes(CurrentFile.Length)})"; while ((currentBlockSize = CurrentFileContent.Read(FSBuffer, 0, FSBuffer.Length)) > 0) { if (cancellationToken.IsCancellationRequested) { throw (new OperationCanceledException(cancellationToken)); } CurrentTask.mre.WaitOne(); NewFileContent.Write(FSBuffer, 0, currentBlockSize); CurrentTask.MovedFileSize += currentBlockSize; } } 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($"[{AppName}] File moved: {NewFile.FullName}"); } logger.Info("File moved: {0}", NewFile.FullName); } 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("Remove moved files?", $"[{AppName}] An error releated to file system is happened while moving files.\n\nError: {ex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error releated to file system is happened while moving files. Error: {ex.Message}."); logger.Fatal(ex); SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } catch (UnauthorizedAccessException uaex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync("Remove moved files?", $"[{AppName}] An error releated to file permissions happened during file movement. Running SLM as Administrator might help.\n\nError: {uaex.Message}.\n\nWould you like to remove files that already moved from target library?", 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).OrderByDescending(x => (x).Length), POptions, CurrentFile => { try { 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)) { if (!NewFile.Directory.Exists) { NewFile.Directory.Create(); CreatedDirectories.Add(NewFile.Directory.FullName); } int currentBlockSize = 0; byte[] FSBuffer = new byte[4096]; using (FileStream CurrentFileContent = CurrentFile.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (FileStream NewFileContent = NewFile.OpenWrite()) { CurrentTask.TaskStatusInfo = $"Copying: {CurrentFile.Name} ({Functions.FileSystem.FormatBytes(CurrentFile.Length)})"; while ((currentBlockSize = CurrentFileContent.Read(FSBuffer, 0, FSBuffer.Length)) > 0) { if (cancellationToken.IsCancellationRequested) { throw (new OperationCanceledException(cancellationToken)); } CurrentTask.mre.WaitOne(); NewFileContent.Write(FSBuffer, 0, currentBlockSize); CurrentTask.MovedFileSize += currentBlockSize; } } 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($"[{AppName}] File moved: {NewFile.FullName}"); } logger.Info("File moved: {0}", NewFile.FullName); } 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("Remove moved files?", $"[{AppName}] An error releated to file system is happened while moving files.\n\nError: {ex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error releated to file system is happened while moving files. Error: {ex.Message}."); logger.Fatal(ex); SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } catch (UnauthorizedAccessException uaex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { if (await Main.FormAccessor.ShowMessageAsync("Remove moved files?", $"[{AppName}] An error releated to file permissions happened during file movement. Running SLM as Administrator might help.\n\nError: {uaex.Message}.\n\nWould you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); } }); CurrentTask.ElapsedTime.Stop(); CurrentTask.MovedFileSize = TotalFileSize; LogToTM($"[{AppName}] Time elapsed: {CurrentTask.ElapsedTime.Elapsed} - Average speed: {Math.Round(((TotalFileSize / 1024f) / 1024f) / CurrentTask.ElapsedTime.Elapsed.TotalSeconds, 3)} MB/sec - Average file size: {Functions.FileSystem.FormatBytes(TotalFileSize / (long)CurrentTask.TotalFileCount)}"); logger.Info("Movement completed in {0} with Average Speed of {1} MB/sec - Average file size: {2}", CurrentTask.ElapsedTime.Elapsed, Math.Round(((TotalFileSize / 1024f) / 1024f) / CurrentTask.ElapsedTime.Elapsed.TotalSeconds, 3), 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("Remove moved files?", $"[{AppName}] Game movement cancelled. Would you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); LogToTM($"[{AppName}] Operation cancelled by user. Time Elapsed: {CurrentTask.ElapsedTime.Elapsed}"); logger.Info("Operation cancelled by used. Elapsed time: {0}", 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("Remove moved files?", $"[{AppName}] An error happened while moving game files. Would you like to remove files that already moved from target library?", MessageDialogStyle.AffirmativeAndNegative) == MessageDialogResult.Affirmative) { Functions.FileSystem.RemoveGivenFiles(CopiedFiles, CreatedDirectories, CurrentTask); } }, System.Windows.Threading.DispatcherPriority.Normal); Main.FormAccessor.TaskManager_Logs.Add($"[{AppName}] An error happened while moving game files. Time Elapsed: {CurrentTask.ElapsedTime.Elapsed}"); logger.Fatal(ex); await SLM.RavenClient.CaptureAsync(new SharpRaven.Data.SentryEvent(ex)); } }
public override async Task <bool> DeleteFilesAsync(List.TaskInfo CurrentTask = null) { try { if (IsCompressed) { CompressedArchivePath.Refresh(); if (CompressedArchivePath.Exists) { await Task.Run(() => CompressedArchivePath.Delete()).ConfigureAwait(false); } } else { await base.DeleteFilesAsync(); DownloadFolder.Refresh(); // downloading folder, if exists if (DownloadFolder.Exists) { await Task.Run(() => DownloadFolder.Delete(true)).ConfigureAwait(false); } WorkShopPath.Refresh(); // workshop folder, if exists if (WorkShopPath.Exists) { await Task.Run(() => WorkShopPath.Delete(true)).ConfigureAwait(false); } FullAcfPath.Refresh(); // game .acf file if (FullAcfPath.Exists) { File.SetAttributes(FullAcfPath.FullName, FileAttributes.Normal); FullAcfPath.Delete(); } WorkShopAcfPath.Refresh(); // workshop .acf file if (WorkShopAcfPath.Exists) { File.SetAttributes(WorkShopAcfPath.FullName, FileAttributes.Normal); WorkShopAcfPath.Delete(); } if (CurrentTask != null) { CurrentTask.TaskStatusInfo = ""; } } return(true); } catch (FileNotFoundException ex) { Logger.Error(ex); return(true); } catch (DirectoryNotFoundException ex) { Logger.Error(ex); return(true); } catch (IOException ex) { Logger.Error(ex); return(true); } catch (UnauthorizedAccessException ex) { Logger.Error(ex); return(true); } catch (Exception ex) { MessageBox.Show(ex.ToString()); Logger.Fatal(ex); return(false); } }
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)); } }
public async Task CompactTask(List.TaskInfo currentTask, System.Threading.CancellationToken cancellationToken) { try { var appFiles = GetFileList(); currentTask.TotalFileCount = appFiles.Count; long totalFileSize = 0; Parallel.ForEach(appFiles, file => System.Threading.Interlocked.Add(ref totalFileSize, file.Length)); currentTask.TotalFileSize = totalFileSize; ReportToTaskManager($"Current status of {AppName} is {(IsCompacted ? "compressed" : "not compressed")} and the task is set to {(currentTask.Compact ? "compress" : "uncompress")} the app."); currentTask.ElapsedTime.Start(); foreach (var file in appFiles) { currentTask.mre.WaitOne(); if (!file.Directory.Exists) { ReportToTaskManager($"Directory doesn't exists !? - {file.Directory.FullName}"); } await CliWrap.Cli.Wrap("compact") .SetArguments($"{(currentTask.Compact ? "/c" : "/u")} /i /q {(currentTask.ForceCompact ? "/f" : "")} /EXE:{currentTask.CompactLevel} {file.Name}") .SetWorkingDirectory(file.Directory.FullName) .SetCancellationToken(cancellationToken) .SetStandardOutputCallback(OnCompactFolderProgress) .SetStandardErrorCallback(OnCompactFolderProgress) .EnableStandardErrorValidation() .ExecuteAsync().ConfigureAwait(false); Functions.TaskManager.ActiveTask.TaskStatusInfo = $"Compressing file: {file.FullName.Replace(InstallationDirectory.FullName, "")}"; currentTask.MovedFileSize += file.Length; } if (InstallationDirectory.Exists) { var result = await CliWrap.Cli.Wrap("compact") .SetArguments($"/s /q") .SetWorkingDirectory(InstallationDirectory.FullName) .SetCancellationToken(cancellationToken) .EnableStandardErrorValidation() .ExecuteAsync().ConfigureAwait(false); var output = result.StandardOutput.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); foreach (var resultText in output.Skip(output.Length - 3)) { ReportToTaskManager(resultText); } } currentTask.ElapsedTime.Stop(); ReportToTaskManager($"[{AppName}] Compact task completed in {currentTask.ElapsedTime.Elapsed}"); IsCompacted = await CompactStatus().ConfigureAwait(false); } catch (OperationCanceledException) { if (!currentTask.ErrorHappened) { currentTask.ErrorHappened = true; Functions.TaskManager.Stop(); currentTask.Active = false; currentTask.Completed = true; ReportToTaskManager(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) { ReportToTaskManager(ex.ToString()); System.Diagnostics.Debug.WriteLine(ex); } }