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

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

作者: braveheart_ | 来源:发表于2018-11-23 09:02 被阅读0次
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);
        }
    }
}

相关文章

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

  • Mybatis(三)

    三 使用XML配置SQL映射器(映射文件)关系型数据库和SQL是经受时间考验和验证的数据存储机制。和其他的ORM ...

  • Tourist with Data Structure Thir

    探索哈希表 概念 哈希集合:哈希集合是集合数据结构的实现之一,用于存储非重复值。哈希映射 :哈希映射是映射数据结构...

  • 集合 -- Map映射

    Map映射 Map集合的数据结构仅仅针对键有效,和值无关 存储的是键值对元素,键是唯一的,值可重复 HashMap...

  • seaweedfs使用说明

    基本概念 master 存储映射关系,文件和fid的映射关系 weed masterNode 系统抽象的结点,抽...

  • SpringBoot2.1映射静态资源地址

    避免通过静态资源地址暴露项目文件结构,可以映射一个自定义目录来访问静态资源 static目录下分别用img和js来...

  • python-10 文件

    读取和写入 文件名和路径 数据库数据库是一个用来存储数据的文件。 大多数的数据库采用类似字典的形式,即将键映射到值...

  • Mac 修改文件MD5值

    1、查看文件的MD5值 打开终端,键入 MD5 文件地址 2、修改文件的MD5值 在1的步骤下,键入...

  • 前端目录规范

    目录规范:本文档用于前端静态资源项目目录规范。 目录命名原则 HTML文件放在${root}/html下;资源文件...

  • Java集合Map常用子类简介

    Map(映射,存储的是“键-值”映射表,“键”是不能重复的) 如果键重复,则相当于修改对应键的值。 Map接口定义...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/lqpdqqtx.html