FindCacheFilesOperation.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.IO;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. namespace YooAsset
  6. {
  7. internal sealed class FindCacheFilesOperation : AsyncOperationBase
  8. {
  9. private enum ESteps
  10. {
  11. None,
  12. Prepare,
  13. UpdateCacheFiles,
  14. Done,
  15. }
  16. private readonly PersistentManager _persistent;
  17. private readonly CacheManager _cache;
  18. private IEnumerator<DirectoryInfo> _filesEnumerator = null;
  19. private float _verifyStartTime;
  20. private ESteps _steps = ESteps.None;
  21. /// <summary>
  22. /// 需要验证的元素
  23. /// </summary>
  24. public readonly List<VerifyCacheFileElement> VerifyElements = new List<VerifyCacheFileElement>(5000);
  25. public FindCacheFilesOperation(PersistentManager persistent, CacheManager cache)
  26. {
  27. _persistent = persistent;
  28. _cache = cache;
  29. }
  30. internal override void InternalOnStart()
  31. {
  32. _steps = ESteps.Prepare;
  33. _verifyStartTime = UnityEngine.Time.realtimeSinceStartup;
  34. }
  35. internal override void InternalOnUpdate()
  36. {
  37. if (_steps == ESteps.None || _steps == ESteps.Done)
  38. return;
  39. if (_steps == ESteps.Prepare)
  40. {
  41. string rootPath = _persistent.SandboxCacheFilesRoot;
  42. DirectoryInfo rootDirectory = new DirectoryInfo(rootPath);
  43. if (rootDirectory.Exists)
  44. {
  45. var directorieInfos = rootDirectory.EnumerateDirectories();
  46. _filesEnumerator = directorieInfos.GetEnumerator();
  47. }
  48. _steps = ESteps.UpdateCacheFiles;
  49. }
  50. if (_steps == ESteps.UpdateCacheFiles)
  51. {
  52. if (UpdateCacheFiles())
  53. return;
  54. // 注意:总是返回成功
  55. _steps = ESteps.Done;
  56. Status = EOperationStatus.Succeed;
  57. float costTime = UnityEngine.Time.realtimeSinceStartup - _verifyStartTime;
  58. YooLogger.Log($"Find cache files elapsed time {costTime:f1} seconds");
  59. }
  60. }
  61. private bool UpdateCacheFiles()
  62. {
  63. if (_filesEnumerator == null)
  64. return false;
  65. bool isFindItem;
  66. while (true)
  67. {
  68. isFindItem = _filesEnumerator.MoveNext();
  69. if (isFindItem == false)
  70. break;
  71. var rootFoder = _filesEnumerator.Current;
  72. var childDirectories = rootFoder.GetDirectories();
  73. foreach (var chidDirectory in childDirectories)
  74. {
  75. string cacheGUID = chidDirectory.Name;
  76. if (_cache.IsCached(cacheGUID))
  77. continue;
  78. // 创建验证元素类
  79. string fileRootPath = chidDirectory.FullName;
  80. string dataFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleDataFileName}";
  81. string infoFilePath = $"{fileRootPath}/{ YooAssetSettings.CacheBundleInfoFileName}";
  82. string dataFileExtension = FindDataFileExtension(chidDirectory);
  83. // 跳过断点续传的临时文件
  84. if (dataFileExtension == ".temp")
  85. continue;
  86. // 注意:根据配置需求数据文件会带文件格式
  87. if (_persistent.AppendFileExtension)
  88. {
  89. if (string.IsNullOrEmpty(dataFileExtension) == false)
  90. dataFilePath += dataFileExtension;
  91. }
  92. VerifyCacheFileElement element = new VerifyCacheFileElement(_cache.PackageName, cacheGUID, fileRootPath, dataFilePath, infoFilePath);
  93. VerifyElements.Add(element);
  94. }
  95. if (OperationSystem.IsBusy)
  96. break;
  97. }
  98. return isFindItem;
  99. }
  100. private string FindDataFileExtension(DirectoryInfo directoryInfo)
  101. {
  102. string dataFileExtension = string.Empty;
  103. var fileInfos = directoryInfo.GetFiles();
  104. foreach (var fileInfo in fileInfos)
  105. {
  106. if (fileInfo.Name.StartsWith(YooAssetSettings.CacheBundleDataFileName))
  107. {
  108. dataFileExtension = fileInfo.Extension;
  109. break;
  110. }
  111. }
  112. return dataFileExtension;
  113. }
  114. }
  115. }