using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using System.IO; 
 | 
  
 | 
  
 | 
public class AssetVersion 
 | 
{ 
 | 
    string m_RelativePath = string.Empty; 
 | 
    public string relativePath { get { return m_RelativePath; } } 
 | 
  
 | 
    string m_FileName; 
 | 
    public string fileName { get { return m_FileName; } } 
 | 
  
 | 
    string m_Extersion = string.Empty; 
 | 
    public string extersion { get { return m_Extersion; } } 
 | 
  
 | 
    string m_Md5 = string.Empty; 
 | 
    public string md5 { get { return m_Md5; } } 
 | 
  
 | 
    int m_Size = 0; 
 | 
    public int size { get { return m_Size; } }       //字节      
 | 
  
 | 
    StorageLocation m_FileLocation = StorageLocation.ExternalStore; 
 | 
    public StorageLocation fileLocation { get { return m_FileLocation; } } 
 | 
  
 | 
    bool m_LocalValid = false; 
 | 
    public bool localValid 
 | 
    { 
 | 
        get { return m_LocalValid; } 
 | 
        set { m_LocalValid = value; } 
 | 
    } 
 | 
  
 | 
    public AssetVersion(string _versionString) 
 | 
    { 
 | 
        var strings = _versionString.Split('\t'); 
 | 
  
 | 
        m_RelativePath = strings[0]; 
 | 
        m_Extersion = strings[1]; 
 | 
        int.TryParse(strings[2], out m_Size); 
 | 
        m_Md5 = strings[3]; 
 | 
  
 | 
        var paths = m_RelativePath.Split('/'); 
 | 
  
 | 
        var lastPath = paths[paths.Length - 1]; 
 | 
        var index = lastPath.LastIndexOf('.'); 
 | 
        if (index != -1) 
 | 
        { 
 | 
            m_FileName = lastPath.Substring(0, index); 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            m_FileName = lastPath; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public AssetCategory GetAssetCategory() 
 | 
    { 
 | 
        if (extersion == ".dll") 
 | 
            return AssetCategory.Dll; 
 | 
        else if (m_RelativePath.StartsWith("ui/")) 
 | 
            return AssetCategory.UI; 
 | 
        else if (m_RelativePath.StartsWith("audio/")) 
 | 
            return AssetCategory.Audio; 
 | 
        else if (m_RelativePath.StartsWith("gmodels/")) 
 | 
            return AssetCategory.Mob; 
 | 
        else if (m_RelativePath.StartsWith("maps/")) 
 | 
            return AssetCategory.Scene; 
 | 
        else if (m_RelativePath.StartsWith("effect/")) 
 | 
            return AssetCategory.Effect; 
 | 
        else if (m_RelativePath.StartsWith("config/")) 
 | 
            return AssetCategory.Config; 
 | 
        else if (m_RelativePath.StartsWith("graphic/")) 
 | 
            return AssetCategory.Shader; 
 | 
        else if (m_RelativePath.StartsWith("video/")) 
 | 
            return AssetCategory.Video; 
 | 
        else 
 | 
            return AssetCategory.Other; 
 | 
    } 
 | 
  
 | 
    public bool CheckLocalFileValid(bool _completeFile) 
 | 
    { 
 | 
        if (_completeFile) 
 | 
        { 
 | 
            var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); 
 | 
            var fileInfo = new FileInfo(path); 
 | 
  
 | 
            if (!fileInfo.Exists) 
 | 
            { 
 | 
                Debug.LogFormat("文件不存在 {0}", path); 
 | 
                return false; 
 | 
            } 
 | 
            if (fileInfo.Length != size) 
 | 
            { 
 | 
                Debug.LogFormat("{0}文件大小不对{1}-{2}", path, size, fileInfo.Length); 
 | 
                return false; 
 | 
            } 
 | 
            var fileMD5 = FileExtersion.GetMD5HashFromFile(path); 
 | 
            if (fileMD5 != md5) 
 | 
            { 
 | 
                Debug.LogFormat("{0}文件md5不对{1}-{2}", path, md5, fileMD5); 
 | 
                return false; 
 | 
            } 
 | 
            return true; 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            if (extersion == ".manifest" || extersion == ".bytes" || extersion == ".txt" || extersion == ".dll") 
 | 
            { 
 | 
                var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); 
 | 
                var fileInfo = new FileInfo(path); 
 | 
  
 | 
                if (!fileInfo.Exists || fileInfo.Length != size || md5 != FileExtersion.GetMD5HashFromFile(path)) 
 | 
                { 
 | 
                    return false; 
 | 
                } 
 | 
            } 
 | 
            else if (string.IsNullOrEmpty(extersion) || extersion.Length == 0) 
 | 
            { 
 | 
                var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); 
 | 
                var fileInfo = new FileInfo(path); 
 | 
  
 | 
                var manifestAssetVersion = AssetVersionUtility.GetAssetVersion(StringUtility.Contact(m_RelativePath, ".manifest")); 
 | 
                if (!fileInfo.Exists || fileInfo.Length != size || manifestAssetVersion == null || !manifestAssetVersion.CheckLocalFileValid(false)) 
 | 
                { 
 | 
                    return false; 
 | 
                } 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); 
 | 
                var fileInfo = new FileInfo(path); 
 | 
                if (!fileInfo.Exists || fileInfo.Length != size) 
 | 
                { 
 | 
                    return false; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    // 检查外部存储文件是否存在 
 | 
    // 不存在则读取随包文件进行比较 
 | 
    // 存在则比较 
 | 
    public bool CheckLocalFileValid(AssetVersion otherAssetInfo) 
 | 
    { 
 | 
        string path = string.Concat(ResourcesPath.Instance.ExternalStorePath, m_RelativePath); 
 | 
  
 | 
        if (!File.Exists(path) && !m_RelativePath.Contains(".txt")) 
 | 
        { 
 | 
            //Debug.LogFormat("转查StreamingAssetPath - 文件不存在 {0} ", path); 
 | 
            if (otherAssetInfo == null || string.IsNullOrEmpty(otherAssetInfo.relativePath)) 
 | 
                return false; 
 | 
  
 | 
            if (otherAssetInfo.size != size) 
 | 
            { 
 | 
                Debug.LogFormat("StreamingAssetPath 文件大小不对{0}-{1}", size, otherAssetInfo.size); 
 | 
                return false; 
 | 
            } 
 | 
  
 | 
            if (otherAssetInfo.md5 != md5) 
 | 
            { 
 | 
                Debug.LogFormat("StreamingAssetPath 文件md5不对{0}-{1}", md5, otherAssetInfo.md5); 
 | 
                return false; 
 | 
            } 
 | 
  
 | 
            return true; 
 | 
        } 
 | 
  
 | 
        return CheckLocalFileValid(false); 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
    public bool IsPriorAsset() 
 | 
    { 
 | 
        if (VersionConfig.Get().partAssetPackage) 
 | 
        { 
 | 
            //如果这台机器曾经完整的下载过所有资源,那么就不再使用分包下载策略,在资源热更新的时候这种情况会触发。 
 | 
            if (AssetVersionUtility.hasDownLoadFullAsset) 
 | 
            { 
 | 
                return true; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                var category = GetAssetCategory(); 
 | 
                // var prior = PriorBundleConfig.GetAssetPrior(category, AssetVersionUtility.DecodeFileName(m_FileName)); 
 | 
                // return prior <= 1; 
 | 
                return false; 
 | 
            } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            return true; 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    public enum StorageLocation 
 | 
    { 
 | 
        StreamingAsset, 
 | 
        ExternalStore 
 | 
    } 
 | 
  
 | 
    public enum AssetCategory 
 | 
    { 
 | 
        UI, 
 | 
        Audio, 
 | 
        Mob, 
 | 
        Scene, 
 | 
        Effect, 
 | 
        Config, 
 | 
        Shader, 
 | 
        Dll, 
 | 
        Video, 
 | 
        Other, 
 | 
        Patch,//补丁 
 | 
        Logic,//热更逻辑代码 
 | 
    } 
 | 
  
 | 
} 
 |