Files
YooAsset/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/SearchCacheFilesOperation.cs

124 lines
4.2 KiB
C#
Raw Normal View History

2023-09-20 16:09:52 +08:00
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
namespace YooAsset
{
internal sealed class SearchCacheFilesOperation : AsyncOperationBase
2023-12-21 19:10:46 +08:00
{
private enum ESteps
{
None,
Prepare,
SearchFiles,
2023-12-21 19:10:46 +08:00
Done,
}
private readonly DefaultCacheFileSystem _fileSystem;
2025-10-13 17:44:37 +08:00
private IEnumerator<string> _filesEnumerator = null;
2023-12-21 19:10:46 +08:00
private float _verifyStartTime;
private ESteps _steps = ESteps.None;
/// <summary>
/// 需要验证的元素
/// </summary>
public readonly List<VerifyFileElement> Result = new List<VerifyFileElement>(5000);
2023-12-21 19:10:46 +08:00
internal SearchCacheFilesOperation(DefaultCacheFileSystem fileSystem)
2023-12-21 19:10:46 +08:00
{
_fileSystem = fileSystem;
2023-12-21 19:10:46 +08:00
}
2025-02-22 16:29:25 +08:00
internal override void InternalStart()
2023-12-21 19:10:46 +08:00
{
_steps = ESteps.Prepare;
_verifyStartTime = UnityEngine.Time.realtimeSinceStartup;
}
2025-02-22 16:29:25 +08:00
internal override void InternalUpdate()
2023-12-21 19:10:46 +08:00
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
if (_steps == ESteps.Prepare)
{
2025-10-13 17:44:37 +08:00
string rootDirectory = _fileSystem.GetCacheBundleFilesRoot();
if (Directory.Exists(rootDirectory))
2023-12-21 19:10:46 +08:00
{
2025-10-13 17:44:37 +08:00
var directories = Directory.EnumerateDirectories(rootDirectory);
_filesEnumerator = directories.GetEnumerator();
2023-12-21 19:10:46 +08:00
}
_steps = ESteps.SearchFiles;
2023-12-21 19:10:46 +08:00
}
if (_steps == ESteps.SearchFiles)
2023-12-21 19:10:46 +08:00
{
if (SearchFiles())
2023-12-21 19:10:46 +08:00
return;
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
float costTime = UnityEngine.Time.realtimeSinceStartup - _verifyStartTime;
YooLogger.Log($"Search cache files elapsed time {costTime:f1} seconds");
2023-12-21 19:10:46 +08:00
}
}
private bool SearchFiles()
2023-12-21 19:10:46 +08:00
{
if (_filesEnumerator == null)
return false;
bool isFindItem;
while (true)
{
isFindItem = _filesEnumerator.MoveNext();
if (isFindItem == false)
break;
var rootFoder = _filesEnumerator.Current;
2025-10-13 17:44:37 +08:00
var childDirectories = Directory.EnumerateDirectories(rootFoder);
2023-12-21 19:10:46 +08:00
foreach (var chidDirectory in childDirectories)
{
2025-10-13 17:44:37 +08:00
string bundleGUID = Path.GetFileName(chidDirectory);
if (_fileSystem.IsRecordBundleFile(bundleGUID))
2023-12-21 19:10:46 +08:00
continue;
// 创建验证元素类
2025-10-13 17:44:37 +08:00
string fileRootPath = chidDirectory;
2025-03-11 15:40:57 +08:00
string dataFilePath = $"{fileRootPath}/{DefaultCacheFileSystemDefine.BundleDataFileName}";
string infoFilePath = $"{fileRootPath}/{DefaultCacheFileSystemDefine.BundleInfoFileName}";
2023-12-21 19:10:46 +08:00
// 存储的数据文件追加文件格式
if (_fileSystem.AppendFileExtension)
2023-12-21 19:10:46 +08:00
{
string dataFileExtension = FindDataFileExtension(chidDirectory);
2025-03-14 14:32:39 +08:00
if (string.IsNullOrEmpty(dataFileExtension) == false)
2025-03-11 15:40:57 +08:00
{
2023-12-21 19:10:46 +08:00
dataFilePath += dataFileExtension;
2025-03-11 15:40:57 +08:00
}
2023-12-21 19:10:46 +08:00
}
var element = new VerifyFileElement(_fileSystem.PackageName, bundleGUID, fileRootPath, dataFilePath, infoFilePath);
Result.Add(element);
2023-12-21 19:10:46 +08:00
}
if (OperationSystem.IsBusy)
break;
}
return isFindItem;
}
2025-10-13 17:44:37 +08:00
private string FindDataFileExtension(string directory)
2023-12-21 19:10:46 +08:00
{
string dataFileExtension = string.Empty;
2025-10-14 16:58:06 +08:00
string searchPattern = DefaultCacheFileSystemDefine.BundleDataFileName + "*";
var dataFiles = Directory.EnumerateFiles(directory, searchPattern);
foreach (var filePath in dataFiles)
2023-12-21 19:10:46 +08:00
{
2025-10-14 16:58:06 +08:00
dataFileExtension = Path.GetExtension(filePath);
2025-10-13 17:44:37 +08:00
break;
2023-12-21 19:10:46 +08:00
}
return dataFileExtension;
}
}
2023-09-20 16:09:52 +08:00
}