Unity编辑器小工具——文件查重(MD5)

算法思想:
在Unity中,每一个不同资源、文件所生成MD5码是不同的,但是相同文件,路径不同、文件名不同的同一类文件的MD5码是相同的,所以可以通过生成每个文件的MD5来判断文件是否是重复的。

具体脚本代码如下:

using UnityEngine;
using System.Collections;
using System.IO;
using UnityEditor;
using System.Security.Cryptography;
using System;
using System.Linq;public class FindMD : MonoBehaviour {string[] files;[MenuItem("Assets/Find Files MD5")]public static void Find(){int flag = 0;string[] files = Directory.GetFiles("Assets/", "*.*", SearchOption.AllDirectories);for (int i = 0; i < files.Length; i++){if (files[i].EndsWith(".meta")){continue;}//加载进度条EditorUtility.DisplayCancelableProgressBar("匹配资源中", files[i], ((float)i / (float)files.Length));for (int j = 0; j < files.Length; j++){if (files[j].EndsWith(".meta")){continue;}if (i != j && getFileMD5(files[i]) == getFileMD5(files[j])){Debug.LogError(files[i] + "   and    " + files[j] + "have the same md5");flag = 1;}}}//清除进度条EditorUtility.ClearProgressBar();if (flag == 0){Debug.Log("No files are equal");}}public static string getFileMD5(string filePath){//将文件路径转化为文件流FileStream fs = new FileStream(filePath, FileMode.Open);byte[] data = new byte[(int)fs.Length];//读文件fs.Read(data, 0, (int)fs.Length);fs.Close();//通过MD5接口生成MD5码(获得的是Hash一个字节数组)MD5加密MD5 md5 = new MD5CryptoServiceProvider();byte[] result = md5.ComputeHash(data);//将获得的Hash字节数组转换为字符串string fileMD5 = "";foreach (byte b in result){fileMD5 += Convert.ToString(b, 16);}//fs.Close();return fileMD5;}
}

注意要点:
1. 在Unity下,每个文件都有对应的meta文件,但是对于文件查重来说并没有什么实际的用途,所以在文件读取对比时可以跳过
2. 在进行meta文件筛选时,有两种办法,一种如脚本中一样,在要比较md5码前,判断是否为meta文件。另一种为在Directory.GetFiles() 时,通过拉曼达表达式来进行筛选,但是在使用拉曼达表达式时,还要使用foreach循环进行查找,所以放弃了后种方法
3. 由于使用了双层for循环,所以查找速率较低,后通过如下脚本进行了改进

改进脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEditor;
using System.Security.Cryptography;
using System;
using System.Linq;public class FindMD_2 : MonoBehaviour {string[] files;[MenuItem("Assets/Find Files MD5")]public static void Find(){int flag = 0;Dictionary<string, string> MDdic = new Dictionary<string, string>();string[] files = Directory.GetFiles("Assets/", "*.*", SearchOption.AllDirectories);string file_2 = "";for (int i = 0; i < files.Length; i++){string filemd5 = getFileMD5(files[i]);if (files[i].EndsWith(".meta")){continue;}//加载进度条EditorUtility.DisplayCancelableProgressBar("匹配资源中", files[i], ((float)i / (float)files.Length));if (MDdic.ContainsValue(filemd5)){foreach (string key in MDdic.Keys){if (MDdic[key].Equals(filemd5)){file_2 = key;}}Debug.LogError(files[i] + "   and    " + file_2.ToString() + "have the same md5");}else{MDdic.Add(files[i], filemd5);}}if (flag == 0){Debug.Log("No files are equal");}}public static string getFileMD5(string filePath){//将文件路径转化为文件流FileStream fs = new FileStream(filePath, FileMode.Open);byte[] data = new byte[(int)fs.Length];//读文件fs.Read(data, 0, (int)fs.Length);fs.Close();//通过MD5接口生成MD5码(获得的是Hash一个字节数组)MD5加密MD5 md5 = new MD5CryptoServiceProvider();byte[] result = md5.ComputeHash(data);//将获得的Hash字节数组转换为字符串string fileMD5 = "";foreach (byte b in result){fileMD5 += Convert.ToString(b, 16);}//fs.Close();return fileMD5;}
}

Unity编辑器小工具——文件查重(MD5)相关推荐

  1. 学习项目---文件查重

    声明:本项目在deepin系统下vim编译的,利用了jieba分词工具,如果在vs编译的话需要设置文件路径,还需要把GDK转成UTF8,在读的时候用UTF8转成GDK 1.文件查重原理: 1.1中文分 ...

  2. Java实现文件查重去重

    Java实现文件查重去重 前言 大概流程 代码 前言 网上下的一些去重软件不是太慢就是去的不够干净,故用Java编写一个使用 大概流程 ① 遍历选定的文件并按照文件长度分组 ② 根据md5二次过滤分组 ...

  3. python文件查重_文件查重 我使用的是面向局部敏感的最小哈希签名的方法进行文档查重 联合开发网 - pudn.com...

    文件查重 所属分类:其他 开发工具:Python 文件大小:39KB 下载次数:7 上传日期:2017-12-20 16:45:32 上 传 者:lala_ 说明:  我使用的是面向局部敏感的最小哈希 ...

  4. 文件查重程序 v1.5.4 官网

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  5. centos7 应用笔记: fslint 文件查重

    centos7 应用笔记: fslint 文件查重 fslint 可以用于文件的查重. fslint 扫描的是文件的内容.如果内容一致,则会认为文件一致.而不论文件名是否一致. 安装 fslint # ...

  6. Unity实用小工具或脚本—以对象方式访问MySql数据库

    一.前言         以对象方式处理MySql数据库顾名思义就是可以将每个数据库表作为一个类,没一条数据作为一个对象来进行操作,大致思路和我上一篇文章类似,这里不再赘述.文章后有资源下载地址,所使 ...

  7. 用java设计一个文件查重程序,输入两个文本文件,输出两个文本文件的重复率(最长公共子序列的应用)...

    你可以使用java代码来设计一个文件查重程序.首先,你需要读取两个文本文件的内容,将它们存储在字符串变量中.然后,你可以使用最长公共子序列(LCS)算法来计算两个字符串的重复率. LCS算法的实现方法 ...

  8. 英文小论文怎么查重?

    小论文以发表在期刊杂志上为主,虽然内容相对其他论文而言较短,但其写作难度并不低,而且不仅写作有难度,后面进行的论文查重难度更大.那英文小论文要怎么查重呢? 一.英文小论文怎么查重 由于是期刊需要发表的 ...

  9. python文件查重工具,基于文件大小和md5/sha1值

    我电脑里面的资料比较凌乱,经常有相同的文件拷来拷去,存在大量重复文件,占用不少空间,所以想到做一个查重工具,具体代码如下 import hashlib import sys import osdef ...

最新文章

  1. Xcode下载安装问题
  2. 计算机网络部分(共44题),计算机网络原理2013年4月真题及答案
  3. C/C++打造经典推箱子小游戏
  4. 三、PHP框架Laravel学习笔记——路由参数、重定向、视图
  5. python编写arcgis脚本教程_ArcGIS使用Python脚本工具
  6. Oracle数据库备份和恢复配置详解
  7. 小米盒子显示gitv不动_2020电视盒子排行榜,五款“真香”盒子报到
  8. Sharding-Proxy读写分离_Sharding-Sphere_分库分表_读写分离_工作笔记021
  9. ps2019布尔运算快捷键_设计师不会告诉你的ps布尔运算,你学会了吗?
  10. Java设计模式05:常用设计模式之原型模式(创建型模式)
  11. 有了它,你还想用postman吗
  12. 高性能web建站规则(尽量减少http请求)
  13. Admob(6.12.x)符号未定义错误的解决方法(IOS)
  14. 1.1.15 word调整文字与下划线之间的间距
  15. 会声会影x4素材_怎么给视频打马赛克?运用会声会影2019
  16. Vue + element + Springboot 通过邮箱找回密码
  17. 盾神与积木游戏 (贪心典例)
  18. 第一批阳了的中年人:卷不赢,躺不平,摆不烂
  19. Java解析word文档,将word文档题库选择题导入
  20. 虎扑网站服务器垃圾,虎扑拿下域名hupu.com 游击队摇身一变正规军

热门文章

  1. 卷积神经网络与全连接神经网络
  2. Vue+element通过接口上传图片给后端
  3. C语言1.5e10什么意思,汽车排量1.5e是什么意思
  4. Wireshark数据包分析
  5. error C2065: ‘salary‘ : undeclared identifier
  6. 攻防世界--杂项misc-János-the-Ripper--题解
  7. # 如何破429问题|x-kpsdk-ct|x-kpsdk-cd|snkrs bot ## nike 429| snkrs 429|nike 新盾 |snkrs 新盾|nike源码|snkrs 源码
  8. 【C#】xml解析对比XDocument和XmlDocument
  9. GETWA_NOT_ASSIGNED
  10. 弹性计算产品专家张新涛:阿里云视觉计算的思考与实践