diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs index 57120331..940a7d96 100644 --- a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/DefaultCacheFileSystem.cs @@ -158,6 +158,11 @@ namespace YooAsset var operation = new ClearUnusedCacheBundleFilesOperation(this, manifest); return operation; } + else if (options.ClearMode == EFileClearMode.ClearBundleFilesByLocations.ToString()) + { + var operation = new ClearCacheBundleFilesByLocationsOperaiton(this, manifest, options.ClearParam); + return operation; + } else if (options.ClearMode == EFileClearMode.ClearBundleFilesByTags.ToString()) { var operation = new ClearCacheBundleFilesByTagsOperaiton(this, manifest, options.ClearParam); diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/ClearCacheBundleFilesByLocationsOperaiton.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/ClearCacheBundleFilesByLocationsOperaiton.cs new file mode 100644 index 00000000..69316ac5 --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/ClearCacheBundleFilesByLocationsOperaiton.cs @@ -0,0 +1,142 @@ +using System.Collections.Generic; + +namespace YooAsset +{ + internal class ClearCacheBundleFilesByLocationsOperaiton : FSClearCacheFilesOperation + { + private enum ESteps + { + None, + CheckManifest, + CheckArgs, + GetClearCacheFiles, + ClearFilterCacheFiles, + Done, + } + + private readonly DefaultCacheFileSystem _fileSystem; + private readonly PackageManifest _manifest; + private readonly object _clearParam; + private string[] _locations; + private List _clearBundleGUIDs; + private int _clearFileTotalCount = 0; + private ESteps _steps = ESteps.None; + + internal ClearCacheBundleFilesByLocationsOperaiton(DefaultCacheFileSystem fileSystem, PackageManifest manifest, object clearParam) + { + _fileSystem = fileSystem; + _manifest = manifest; + _clearParam = clearParam; + } + + internal override void InternalStart() + { + _steps = ESteps.CheckManifest; + } + + internal override void InternalUpdate() + { + if (_steps == ESteps.None || _steps == ESteps.Done) + return; + + if (_steps == ESteps.CheckManifest) + { + if (_manifest == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = "Can not found active package manifest !"; + } + else + { + _steps = ESteps.CheckArgs; + } + } + + if (_steps == ESteps.CheckArgs) + { + if (_clearParam == null) + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = "Clear param is null !"; + return; + } + + if (_clearParam is string) + { + _locations = new string[] { _clearParam as string }; + } + else if (_clearParam is List) + { + var tempList = _clearParam as List; + _locations = tempList.ToArray(); + } + else if (_clearParam is string[]) + { + _locations = _clearParam as string[]; + } + else + { + _steps = ESteps.Done; + Status = EOperationStatus.Failed; + Error = $"Invalid clear param : {_clearParam.GetType().FullName}"; + return; + } + + _steps = ESteps.GetClearCacheFiles; + } + + if (_steps == ESteps.GetClearCacheFiles) + { + _clearBundleGUIDs = GetBundleGUIDsByLocation(); + _clearFileTotalCount = _clearBundleGUIDs.Count; + _steps = ESteps.ClearFilterCacheFiles; + } + + if (_steps == ESteps.ClearFilterCacheFiles) + { + for (int i = _clearBundleGUIDs.Count - 1; i >= 0; i--) + { + string bundleGUID = _clearBundleGUIDs[i]; + _fileSystem.DeleteCacheBundleFile(bundleGUID); + _clearBundleGUIDs.RemoveAt(i); + if (OperationSystem.IsBusy) + break; + } + + if (_clearFileTotalCount == 0) + Progress = 1.0f; + else + Progress = 1.0f - (_clearBundleGUIDs.Count / _clearFileTotalCount); + + if (_clearBundleGUIDs.Count == 0) + { + _steps = ESteps.Done; + Status = EOperationStatus.Succeed; + } + } + } + + private List GetBundleGUIDsByLocation() + { + List result = new List(_locations.Length); + + foreach (var location in _locations) + { + string assetPath = _manifest.TryMappingToAssetPath(location); + if (_manifest.TryGetPackageAsset(assetPath, out PackageAsset packageAsset)) + { + PackageBundle bundle = _manifest.GetMainPackageBundle(packageAsset.BundleID); + + if (bundle != null) + { + result.Add(bundle.BundleGUID); + } + } + } + + return result; + } + } +} \ No newline at end of file diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/ClearCacheBundleFilesByLocationsOperaiton.cs.meta b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/ClearCacheBundleFilesByLocationsOperaiton.cs.meta new file mode 100644 index 00000000..089be6bf --- /dev/null +++ b/Assets/YooAsset/Runtime/FileSystem/DefaultCacheFileSystem/Operation/internal/ClearCacheBundleFilesByLocationsOperaiton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0be6ffd570645bf4a95126958a8e8a86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/YooAsset/Runtime/FileSystem/EFileClearMode.cs b/Assets/YooAsset/Runtime/FileSystem/EFileClearMode.cs index 20564f74..ff420fd4 100644 --- a/Assets/YooAsset/Runtime/FileSystem/EFileClearMode.cs +++ b/Assets/YooAsset/Runtime/FileSystem/EFileClearMode.cs @@ -16,6 +16,12 @@ namespace YooAsset /// ClearUnusedBundleFiles, + /// + /// 清理指定地址的文件 + /// 说明:需要指定参数,可选:string, string[], List + /// + ClearBundleFilesByLocations, + /// /// 清理指定标签的文件 /// 说明:需要指定参数,可选:string, string[], List