public async Task AddGame(GameOnPc game, short destinationFolderIndex) { string format = GetGdemuFolderNameFromIndex(destinationFolderIndex); string destinationFolder = Path.GetFullPath(DrivePath + destinationFolderIndex.ToString(format)); if (game.MustShrink) { if (Directory.Exists(destinationFolder)) { FileManager.RemoveAllFilesInDirectory(destinationFolder); } else { Directory.CreateDirectory(destinationFolder); } var oldGdiPath = Directory.EnumerateFiles(game.FullPath).Single(f => Path.GetExtension(f) == ".gdi"); //var commandResult = await Command // .Run(@".\gditools\dist\gditools_messily_tweaked.exe", oldGdiPath, destinationFolder) // .Task; var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromMinutes(2)); Command command = null; try { command = Command.Run(@".\gditools\dist\gditools_messily_tweaked.exe", oldGdiPath, destinationFolder); await command.Task.WaitOrCancel(cts.Token); } catch (OperationCanceledException ex) { if (command != null) { command.Kill(); } throw new OperationCanceledException($"Timeout while shrinking {game.GameName}. You might need to copy it without shrinking."); } //if (!commandResult.Success) //{ // // There is always an error even if it's working, need find out why // //throw new System.Exception("There was an error while shriking the GDI: " + commandResult.StandardError); //} var gdiPath = Directory.EnumerateFiles(destinationFolder).SingleOrDefault(f => Path.GetExtension(f) == ".gdi"); if (gdiPath == null) { throw new OperationCanceledException($"Could not shrink {game.GameName}. You might need to copy it without shrinking."); } var newGdi = GameManager.GetGdiFromFile(gdiPath); File.Delete(gdiPath); newGdi.SaveTo(Path.Combine(destinationFolder, "disc.gdi"), true); newGdi.RenameTrackFiles(destinationFolder); } else { await FileManager.CopyDirectoryContentToAnother(game.FullPath, destinationFolder, true); var gdiPath = Directory.EnumerateFiles(destinationFolder).Single(f => Path.GetExtension(f) == ".gdi"); var newGdi = GameManager.GetGdiFromFile(gdiPath); File.Delete(gdiPath); newGdi.SaveTo(Path.Combine(destinationFolder, "disc.gdi"), true); newGdi.RenameTrackFiles(destinationFolder); } }