存储项目目录下文件md5值和guid映射关系数据,方便重复资源校验

using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEditor;
using UnityEngine;

namespace AssetsRepeatCheckSys
{
    /// <summary>
    /// AtlasInfo.asset数据结构
    /// </summary>
    class AtlasInfo : ScriptableObject
    {
        [SerializeField]
        private List<string> MD5s = new List<string>();
        [SerializeField]
        private List<string> GUIDs = new List<string>();
        private Dictionary<string, string> dic = new Dictionary<string, string>();

        [NonSerialized]
        private string tempOutVal;

        public void PushListValue(string md5, string guid)
        {
            MD5s.Add(md5);
            GUIDs.Add(guid);

            if (dic.TryGetValue(md5, out tempOutVal))
            {
                Debug.LogError("Repeat assets!!!  exist:" + AssetDatabase.GUIDToAssetPath(tempOutVal) + "  repeat:" + AssetDatabase.GUIDToAssetPath(guid));
            }
            else
            {
                dic.Add(md5, guid);
            }
        }

        public void GenerateDicData()
        {
            for (int i = 0; i < MD5s.Count; i++)
            {
                dic.Add(MD5s[i], GUIDs[i]);
            }
        }
    }

    /// <summary>
    /// 相关接口方法
    /// </summary>
    class AtlasInfoAssetFactory
    {
        public static string _atlsPath = Application.dataPath + "/Arts/UI2/Atlas/";
        public static string _assetPath = "Assets/_editorconfig/AtlasInfo.asset";

        /// <summary>
        /// 创建Asset文件
        /// </summary>
        [MenuItem("Tools/GameKits/Assets Repeat Check")]
        static void AssetInstance()
        {
            //AtlasInfo atlasInfo = AssetDatabase.LoadAssetAtPath<AtlasInfo>(_assetPath);
            AtlasInfo atlasInfo = ScriptableObject.CreateInstance<AtlasInfo>();

            DirectoryInfo directoryInfo = new DirectoryInfo(_atlsPath);
            DirectoryInfo[] directorys = directoryInfo.GetDirectories();

            EditorUtility.DisplayProgressBar("Repeat Assets Check", "大哥喝口茶等一下啊!进度条我就暂时不处理了。", 0);

            string fileName;
            foreach (DirectoryInfo dir in directorys)
            {
                FileInfo[] fileInfos = dir.GetFiles();

                foreach (FileInfo fileInfo in fileInfos)
                {
                    fileName = dir.FullName + "/" + fileInfo.Name;
                    if (fileName.EndsWith(".meta"))
                        continue;

                    string md5 = AtlasSysHelper.GetMD5Hash(fileName);
                    string guid = AtlasSysHelper.GetGuidValue(fileName);
                    //Debug.Log(md5 + "      " + guid);
                    if (string.IsNullOrEmpty(md5) || string.IsNullOrEmpty(guid))
                    {
                        Debug.LogError("File parse is error, file:" + fileName);
                        continue;
                    }
                    atlasInfo.PushListValue(md5, guid);
                }
            }

            AssetDatabase.CreateAsset(atlasInfo, _assetPath);
            AssetDatabase.SaveAssets();

            EditorUtility.ClearProgressBar();
        }


        static void AssetReader()
        {
            AtlasInfo atlasInfo = AssetDatabase.LoadAssetAtPath<AtlasInfo>(_assetPath);
            atlasInfo.GenerateDicData();
        }
    }

    /// <summary>
    /// 工具方法
    /// </summary>
    class AtlasSysHelper
    {
        /// <summary>
        /// 获得文件MD5值
        /// </summary>
        /// <param name="filePath">文件路径名</param>
        /// <returns>MD5值</returns>
        public static string GetMD5Hash(string filePath)
        {
            if (!File.Exists(filePath))
                return "";

            try
            {
                FileStream fs = new FileStream(filePath, FileMode.Open);
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] bytes = md5.ComputeHash(fs);
                fs.Close();

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < bytes.Length; i++)
                {
                    sb.Append(bytes[i].ToString("x2"));
                }

                return sb.ToString();
            }
            catch (Exception e)
            {
                throw new Exception("GetMD5Hash function do fail, error:" + e.Message);
            }
        }

        public static string GetGuidValue(string path)
        {
            int index = path.IndexOf("Assets");
            string relativePath = path.Substring(index);
            //Debug.Log(relativePath);
            return AssetDatabase.AssetPathToGUID(relativePath);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容