using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using UnityEngine; using Debug = UnityEngine.Debug; namespace YooAsset { internal static class CacheHelper { /// /// 禁用Unity缓存系统在WebGL平台 /// public static bool DisableUnityCacheOnWebGL = false; /// /// 验证缓存文件(子线程内操作) /// public static EVerifyResult VerifyingCacheFile(VerifyCacheFileElement element, EVerifyLevel verifyLevel) { try { if (verifyLevel == EVerifyLevel.Low) { if (File.Exists(element.InfoFilePath) == false) return EVerifyResult.InfoFileNotExisted; if (File.Exists(element.DataFilePath) == false) { Debug.LogError("校验文件{element.DataFilePath}不存在"); 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; } // Debug.Log($"验证缓存文件, {element.DataFilePath}"); return VerifyingInternal(element.DataFilePath, element.DataFileSize, element.DataFileCRC, verifyLevel); } /// /// 验证下载文件(子线程内操作) /// public static EVerifyResult VerifyingTempFile(VerifyTempFileElement element) { Debug.Log($"验证下载文件, {element.TempDataFilePath}"); return VerifyingInternal(element.TempDataFilePath, element.FileSize, element.FileCRC, EVerifyLevel.High); } /// /// 验证记录文件(主线程内操作) /// public static EVerifyResult VerifyingRecordFile(CacheManager cache, string cacheGUID) { var wrapper = cache.TryGetWrapper(cacheGUID); if (wrapper == null) return EVerifyResult.CacheNotFound; Debug.Log($"验证记录文件, {wrapper.DataFilePath}"); EVerifyResult result = VerifyingInternal(wrapper.DataFilePath, wrapper.DataFileSize, wrapper.DataFileCRC, EVerifyLevel.High); return result; } 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) { Debug.LogWarning($"文件太小,{filePath}"); return EVerifyResult.FileNotComplete; } else if (size > fileSize) { Debug.LogWarning($"文件太大,{filePath}"); return EVerifyResult.FileOverflow; } // 再验证文件CRC if (verifyLevel == EVerifyLevel.High) { string crc = HashUtility.FileCRC32(filePath); if (crc == fileCRC) return EVerifyResult.Succeed; else { Debug.LogWarning($"文件CRC不匹配,{filePath}"); return EVerifyResult.FileCrcError; } } else { return EVerifyResult.Succeed; } } catch (Exception) { Debug.LogWarning($"文件校验异常,{filePath}"); return EVerifyResult.Exception; } } } }