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

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

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

        [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]);
            }
        }
    }

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

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

            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(_assetPath);
            atlasInfo.GenerateDicData();
        }
    }

    /// 
    /// 工具方法
    /// 
    class AtlasSysHelper
    {
        /// 
        /// 获得文件MD5值
        /// 
        /// 文件路径名
        /// MD5值
        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);
        }
    }
}

你可能感兴趣的:(存储项目目录下文件md5值和guid映射关系数据,方便重复资源校验)