123 lines
4.4 KiB
C#
123 lines
4.4 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 禁用Unity缓存系统在WebGL平台
|
||
/// </summary>
|
||
public static bool DisableUnityCacheOnWebGL = false;
|
||
|
||
/// <summary>
|
||
/// 验证缓存文件(子线程内操作)
|
||
/// </summary>
|
||
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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 验证下载文件(子线程内操作)
|
||
/// </summary>
|
||
public static EVerifyResult VerifyingTempFile(VerifyTempFileElement element)
|
||
{
|
||
Debug.Log($"验证下载文件, {element.TempDataFilePath}");
|
||
return VerifyingInternal(element.TempDataFilePath, element.FileSize, element.FileCRC, EVerifyLevel.High);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 验证记录文件(主线程内操作)
|
||
/// </summary>
|
||
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;
|
||
}
|
||
}
|
||
}
|
||
} |