| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | using System;using System.IO;using System.Collections;using System.Collections.Generic;using System.Diagnostics;namespace YooAsset{	internal static class CacheSystem	{		private readonly static Dictionary<string, PackageCache> _cachedDic = new Dictionary<string, PackageCache>(1000);		/// <summary>		/// 禁用Unity缓存系统在WebGL平台		/// </summary>		public static bool DisableUnityCacheOnWebGL = false;		/// <summary>		/// 初始化时的验证级别		/// </summary>		public static EVerifyLevel InitVerifyLevel { set; get; } = EVerifyLevel.Middle;		/// <summary>		/// 清空所有数据		/// </summary>		public static void ClearAll()		{			_cachedDic.Clear();		}		/// <summary>		/// 清空指定包裹的所有缓存数据		/// </summary>		public static void ClearPackage(string packageName)		{			var cache = GetOrCreateCache(packageName);			cache.ClearAll();		}		/// <summary>		/// 获取缓存文件总数		/// </summary>		public static int GetCachedFilesCount(string packageName)		{			var cache = GetOrCreateCache(packageName);			return cache.GetCachedFilesCount();		}		/// <summary>		/// 查询是否为验证文件		/// </summary>		public static bool IsCached(string packageName, string cacheGUID)		{			var cache = GetOrCreateCache(packageName);			return cache.IsCached(cacheGUID);		}		/// <summary>		/// 录入验证的文件		/// </summary>		public static void RecordFile(string packageName, string cacheGUID, PackageCache.RecordWrapper wrapper)		{			//YooLogger.Log($"Record file : {packageName} = {cacheGUID}");			var cache = GetOrCreateCache(packageName);			cache.Record(cacheGUID, wrapper);		}		/// <summary>		/// 丢弃验证的文件(同时删除文件)		/// </summary>		public static void DiscardFile(string packageName, string cacheGUID)		{			var cache = GetOrCreateCache(packageName);			var wrapper = cache.TryGetWrapper(cacheGUID);			if (wrapper == null)				return;			cache.Discard(cacheGUID);			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}");			}		}		/// <summary>		/// 验证缓存文件(子线程内操作)		/// </summary>		public static EVerifyResult VerifyingCacheFile(VerifyCacheElement element)		{			try			{				if (InitVerifyLevel == EVerifyLevel.Low)				{					if (File.Exists(element.InfoFilePath) == false)						return EVerifyResult.InfoFileNotExisted;					if (File.Exists(element.DataFilePath) == false)						return EVerifyResult.DataFileNotExisted;					return EVerifyResult.Succeed;				}				else				{					if (File.Exists(element.InfoFilePath) == false)						return EVerifyResult.InfoFileNotExisted;					// 解析信息文件获取验证数据					CacheFileInfo.ReadInfoFromFile(element.InfoFilePath, out element.DataFileCRC, out element.DataFileSize);				}			}			catch (Exception)			{				return EVerifyResult.Exception;			}			return VerifyingInternal(element.DataFilePath, element.DataFileSize, element.DataFileCRC, InitVerifyLevel);		}		/// <summary>		/// 验证下载文件(子线程内操作)		/// </summary>		public static EVerifyResult VerifyingTempFile(VerifyTempElement element)		{			return VerifyingInternal(element.TempDataFilePath, element.FileSize, element.FileCRC, EVerifyLevel.High);		}		/// <summary>		/// 验证记录文件(主线程内操作)		/// </summary>		public static EVerifyResult VerifyingRecordFile(string packageName, string cacheGUID)		{			var cache = GetOrCreateCache(packageName);			var wrapper = cache.TryGetWrapper(cacheGUID);			if (wrapper == null)				return EVerifyResult.CacheNotFound;			EVerifyResult result = VerifyingInternal(wrapper.DataFilePath, wrapper.DataFileSize, wrapper.DataFileCRC, EVerifyLevel.High);			return result;		}		/// <summary>		/// 获取未被使用的缓存文件		/// </summary>		public static List<string> GetUnusedCacheGUIDs(ResourcePackage package)		{			var cache = GetOrCreateCache(package.PackageName);			var keys = cache.GetAllKeys();			List<string> result = new List<string>(keys.Count);			foreach (var cacheGUID in keys)			{				if (package.IsIncludeBundleFile(cacheGUID) == false)				{					result.Add(cacheGUID);				}			}			return result;		}		/// <summary>		/// 获取所有的缓存文件		/// </summary>		public static List<string> GetAllCacheGUIDs(ResourcePackage package)		{			var cache = GetOrCreateCache(package.PackageName);			return cache.GetAllKeys();		}		private static EVerifyResult VerifyingInternal(string filePath, long fileSize, string fileCRC, EVerifyLevel verifyLevel)		{			try			{				if (File.Exists(filePath) == false)					return EVerifyResult.DataFileNotExisted;				// 先验证文件大小				long size = FileUtility.GetFileSize(filePath);				if (size < fileSize)					return EVerifyResult.FileNotComplete;				else if (size > fileSize)					return EVerifyResult.FileOverflow;				// 再验证文件CRC				if (verifyLevel == EVerifyLevel.High)				{					string crc = HashUtility.FileCRC32(filePath);					if (crc == fileCRC)						return EVerifyResult.Succeed;					else						return EVerifyResult.FileCrcError;				}				else				{					return EVerifyResult.Succeed;				}			}			catch (Exception)			{				return EVerifyResult.Exception;			}		}		private static PackageCache GetOrCreateCache(string packageName)		{			if (_cachedDic.TryGetValue(packageName, out PackageCache cache) == false)			{				cache = new PackageCache(packageName);				_cachedDic.Add(packageName, cache);			}			return cache;		}	}}
 |