SaveModel.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using LibHac.Fs;
  2. using LibHac.Ncm;
  3. using Ryujinx.Ava.UI.ViewModels;
  4. using Ryujinx.Ava.UI.Windows;
  5. using Ryujinx.HLE.FileSystem;
  6. using System;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. namespace Ryujinx.Ava.UI.Models
  11. {
  12. public class SaveModel : BaseModel
  13. {
  14. private long _size;
  15. public ulong SaveId { get; }
  16. public ProgramId TitleId { get; }
  17. public string TitleIdString => $"{TitleId.Value:X16}";
  18. public UserId UserId { get; }
  19. public bool InGameList { get; }
  20. public string Title { get; }
  21. public byte[] Icon { get; }
  22. public long Size
  23. {
  24. get => _size; set
  25. {
  26. _size = value;
  27. SizeAvailable = true;
  28. OnPropertyChanged();
  29. OnPropertyChanged(nameof(SizeString));
  30. OnPropertyChanged(nameof(SizeAvailable));
  31. }
  32. }
  33. public bool SizeAvailable { get; set; }
  34. public string SizeString => GetSizeString();
  35. private string GetSizeString()
  36. {
  37. const int scale = 1024;
  38. string[] orders = { "GiB", "MiB", "KiB" };
  39. long max = (long)Math.Pow(scale, orders.Length);
  40. foreach (string order in orders)
  41. {
  42. if (Size > max)
  43. {
  44. return $"{decimal.Divide(Size, max):##.##} {order}";
  45. }
  46. max /= scale;
  47. }
  48. return "0 KiB";
  49. }
  50. public SaveModel(SaveDataInfo info, VirtualFileSystem virtualFileSystem)
  51. {
  52. SaveId = info.SaveDataId;
  53. TitleId = info.ProgramId;
  54. UserId = info.UserId;
  55. var appData = MainWindow.MainWindowViewModel.Applications.FirstOrDefault(x => x.TitleId.ToUpper() == TitleIdString);
  56. InGameList = appData != null;
  57. if (InGameList)
  58. {
  59. Icon = appData.Icon;
  60. Title = appData.TitleName;
  61. }
  62. else
  63. {
  64. var appMetadata = MainWindow.MainWindowViewModel.ApplicationLibrary.LoadAndSaveMetaData(TitleIdString);
  65. Title = appMetadata.Title ?? TitleIdString;
  66. }
  67. Task.Run(() =>
  68. {
  69. var saveRoot = System.IO.Path.Combine(virtualFileSystem.GetNandPath(), $"user/save/{info.SaveDataId:x16}");
  70. long total_size = GetDirectorySize(saveRoot);
  71. long GetDirectorySize(string path)
  72. {
  73. long size = 0;
  74. if (Directory.Exists(path))
  75. {
  76. var directories = Directory.GetDirectories(path);
  77. foreach (var directory in directories)
  78. {
  79. size += GetDirectorySize(directory);
  80. }
  81. var files = Directory.GetFiles(path);
  82. foreach (var file in files)
  83. {
  84. size += new FileInfo(file).Length;
  85. }
  86. }
  87. return size;
  88. }
  89. Size = total_size;
  90. });
  91. }
  92. }
  93. }