using System; using System.IO; using System.Collections; using System.Collections.Generic; namespace YooAsset { internal class CacheManager { internal class RecordWrapper { public string InfoFilePath { private set; get; } public string DataFilePath { private set; get; } public string DataFileCRC { private set; get; } public long DataFileSize { private set; get; } public RecordWrapper(string infoFilePath, string dataFilePath, string dataFileCRC, long dataFileSize) { InfoFilePath = infoFilePath; DataFilePath = dataFilePath; DataFileCRC = dataFileCRC; DataFileSize = dataFileSize; } } private readonly Dictionary _wrappers = new Dictionary(); /// /// 所属包裹 /// public readonly string PackageName; /// /// 验证级别 /// public readonly EVerifyLevel BootVerifyLevel; public CacheManager(string packageName, EVerifyLevel bootVerifyLevel) { PackageName = packageName; BootVerifyLevel = bootVerifyLevel; } /// /// 清空所有数据 /// public void ClearAll() { _wrappers.Clear(); } /// /// 查询缓存记录 /// public bool IsCached(string cacheGUID) { return _wrappers.ContainsKey(cacheGUID); } /// /// 记录验证结果 /// public void Record(string cacheGUID, RecordWrapper wrapper) { if (_wrappers.ContainsKey(cacheGUID) == false) { _wrappers.Add(cacheGUID, wrapper); } else { throw new Exception("Should never get here !"); } } /// /// 丢弃验证结果并删除缓存文件 /// public void Discard(string cacheGUID) { var wrapper = TryGetWrapper(cacheGUID); if (wrapper != null) { try { string dataFilePath = wrapper.DataFilePath; FileInfo fileInfo = new FileInfo(dataFilePath); if (fileInfo.Exists) fileInfo.Directory.Delete(true); } catch (Exception e) { YooLogger.Error($"Failed to delete cache file ! {e.Message}"); } } if (_wrappers.ContainsKey(cacheGUID)) { _wrappers.Remove(cacheGUID); } } /// /// 获取记录对象 /// public RecordWrapper TryGetWrapper(string cacheGUID) { if (_wrappers.TryGetValue(cacheGUID, out RecordWrapper value)) return value; else return null; } /// /// 获取缓存文件总数 /// public int GetAllCachedFilesCount() { return _wrappers.Count; } /// /// 获取缓存GUID集合 /// public List GetAllCachedGUIDs() { List keys = new List(_wrappers.Keys.Count); var keyCollection = _wrappers.Keys; foreach (var key in keyCollection) { keys.Add(key); } return keys; } } }