SaveModel.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 Ryujinx.UI.App.Common;
  7. using Ryujinx.UI.Common.Helper;
  8. using System;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Threading.Tasks;
  12. using Path = System.IO.Path;
  13. namespace Ryujinx.Ava.UI.Models
  14. {
  15. public class SaveModel : BaseModel
  16. {
  17. private long _size;
  18. public ulong SaveId { get; }
  19. public ProgramId TitleId { get; }
  20. public string TitleIdString => TitleId.ToString();
  21. public UserId UserId { get; }
  22. public bool InGameList { get; }
  23. public string Title { get; }
  24. public byte[] Icon { get; }
  25. public long Size
  26. {
  27. get => _size; set
  28. {
  29. _size = value;
  30. SizeAvailable = true;
  31. OnPropertyChanged();
  32. OnPropertyChanged(nameof(SizeString));
  33. OnPropertyChanged(nameof(SizeAvailable));
  34. }
  35. }
  36. public bool SizeAvailable { get; set; }
  37. public string SizeString => ValueFormatUtils.FormatFileSize(Size);
  38. public SaveModel(SaveDataInfo info)
  39. {
  40. SaveId = info.SaveDataId;
  41. TitleId = info.ProgramId;
  42. UserId = info.UserId;
  43. var appData = MainWindow.MainWindowViewModel.Applications.FirstOrDefault(x => x.IdString.Equals(TitleIdString, StringComparison.OrdinalIgnoreCase));
  44. InGameList = appData != null;
  45. if (InGameList)
  46. {
  47. Icon = appData.Icon;
  48. Title = appData.Name;
  49. }
  50. else
  51. {
  52. var appMetadata = ApplicationLibrary.LoadAndSaveMetaData(TitleIdString);
  53. Title = appMetadata.Title ?? TitleIdString;
  54. }
  55. Task.Run(() =>
  56. {
  57. var saveRoot = Path.Combine(VirtualFileSystem.GetNandPath(), $"user/save/{info.SaveDataId:x16}");
  58. long totalSize = GetDirectorySize(saveRoot);
  59. static long GetDirectorySize(string path)
  60. {
  61. long size = 0;
  62. if (Directory.Exists(path))
  63. {
  64. var directories = Directory.GetDirectories(path);
  65. foreach (var directory in directories)
  66. {
  67. size += GetDirectorySize(directory);
  68. }
  69. var files = Directory.GetFiles(path);
  70. foreach (var file in files)
  71. {
  72. size += new FileInfo(file).Length;
  73. }
  74. }
  75. return size;
  76. }
  77. Size = totalSize;
  78. });
  79. }
  80. }
  81. }