ClearUnusedCacheFilesOperation.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. namespace YooAsset
  5. {
  6. /// <summary>
  7. /// 清理本地包裹未使用的缓存文件
  8. /// </summary>
  9. public sealed class ClearUnusedCacheFilesOperation : AsyncOperationBase
  10. {
  11. private enum ESteps
  12. {
  13. None,
  14. GetUnusedCacheFiles,
  15. ClearUnusedCacheFiles,
  16. Done,
  17. }
  18. private readonly ResourcePackage _package;
  19. private readonly CacheManager _cache;
  20. private List<string> _unusedCacheGUIDs;
  21. private int _unusedFileTotalCount = 0;
  22. private ESteps _steps = ESteps.None;
  23. internal ClearUnusedCacheFilesOperation(ResourcePackage package, CacheManager cache)
  24. {
  25. _package = package;
  26. _cache = cache;
  27. }
  28. internal override void InternalOnStart()
  29. {
  30. _steps = ESteps.GetUnusedCacheFiles;
  31. }
  32. internal override void InternalOnUpdate()
  33. {
  34. if (_steps == ESteps.None || _steps == ESteps.Done)
  35. return;
  36. if (_steps == ESteps.GetUnusedCacheFiles)
  37. {
  38. _unusedCacheGUIDs = GetUnusedCacheGUIDs();
  39. _unusedFileTotalCount = _unusedCacheGUIDs.Count;
  40. YooLogger.Log($"Found unused cache file count : {_unusedFileTotalCount}");
  41. _steps = ESteps.ClearUnusedCacheFiles;
  42. }
  43. if (_steps == ESteps.ClearUnusedCacheFiles)
  44. {
  45. for (int i = _unusedCacheGUIDs.Count - 1; i >= 0; i--)
  46. {
  47. string cacheGUID = _unusedCacheGUIDs[i];
  48. _cache.Discard(cacheGUID);
  49. _unusedCacheGUIDs.RemoveAt(i);
  50. if (OperationSystem.IsBusy)
  51. break;
  52. }
  53. if (_unusedFileTotalCount == 0)
  54. Progress = 1.0f;
  55. else
  56. Progress = 1.0f - (_unusedCacheGUIDs.Count / _unusedFileTotalCount);
  57. if (_unusedCacheGUIDs.Count == 0)
  58. {
  59. _steps = ESteps.Done;
  60. Status = EOperationStatus.Succeed;
  61. }
  62. }
  63. }
  64. private List<string> GetUnusedCacheGUIDs()
  65. {
  66. var allCacheGUIDs = _cache.GetAllCachedGUIDs();
  67. List<string> result = new List<string>(allCacheGUIDs.Count);
  68. foreach (var cacheGUID in allCacheGUIDs)
  69. {
  70. if (_package.IsIncludeBundleFile(cacheGUID) == false)
  71. {
  72. result.Add(cacheGUID);
  73. }
  74. }
  75. return result;
  76. }
  77. }
  78. }