You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
7.4 KiB
218 lines
7.4 KiB
using AX.NetworkSystem; |
|
using System; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using System.IO; |
|
using System.Security.Cryptography; |
|
using System.Xml; |
|
using UnityEngine; |
|
|
|
public class CreateMD5Tool |
|
{ |
|
private static CreateMD5Tool instance; |
|
public static CreateMD5Tool Instance |
|
{ |
|
get |
|
{ |
|
if (instance == null) |
|
{ |
|
instance = new CreateMD5Tool(); |
|
} |
|
return instance; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 创建配置文件 |
|
/// </summary> |
|
/// <param name="directoryPath">需要生成MD5文件的路径</param> |
|
/// <param name="fileVersionPath">生成MD5的配置文件</param> |
|
/// <param name="data"></param> |
|
public void CreateManifestXml(string directoryPath, string fileVersionPath, Dictionary<string, string> data) |
|
{ |
|
setFileXML(directoryPath, fileVersionPath, data); |
|
} |
|
public void CreateManifestXml(string directoryPath, string fileVersionPath) |
|
{ |
|
var data = new Dictionary<string, string>(); |
|
setFileXML(directoryPath, fileVersionPath, data); |
|
} |
|
|
|
private void setFileXML(string directoryPath, string fileVersionPath, Dictionary<string, string> data) |
|
{ |
|
if (Directory.Exists(directoryPath)) |
|
{ |
|
string[] strArray = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories); |
|
for (int i = 0; i < strArray.Length; i++) |
|
{ |
|
if (!strArray[i].EndsWith(".meta") && !strArray[i].EndsWith(".manifest")) |
|
{ |
|
string key = strArray[i].Replace(directoryPath, string.Empty); |
|
//排除掉地图文件,地图资源单独更新,因此在进行版本更新时不需要更新地图资源,所以在生成资源配置表时剔除掉地图资源 |
|
if (!key.Contains(@"\AssetBundles\assets\mapfiles")) |
|
{ |
|
string str = this.getFileHash(strArray[i]); |
|
data.Add(key, str); |
|
} |
|
} |
|
} |
|
SaveVersionFile(data, fileVersionPath); |
|
} |
|
} |
|
/// <summary> |
|
/// 测试用:将文件夹内的所有文件(除xml外)上传到服务器 |
|
/// </summary> |
|
/// <param name="directoryPath"></param> |
|
public void UploadDirectoryFiles(string directoryPath,string id) |
|
{ |
|
if (Directory.Exists(directoryPath)) |
|
{ |
|
string[] strArray = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories); |
|
for(int i = 0; i < strArray.Length; i++) |
|
{ |
|
if(!strArray[i].EndsWith(".xml") && !strArray[i].EndsWith(".meta") && !strArray[i].EndsWith(".manifest")) |
|
{ |
|
string fileName = strArray[i].Replace(directoryPath, id + "/"); |
|
NetworkManager.Default.UploadFileAsync(strArray[i], fileName, null, null, OnUploadCompelete); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private void OnUploadCompelete(string fullName, string fileName) |
|
{ |
|
Debug.Log("已将" + fullName + "上传至服务器,文件名:" + fileName); |
|
} |
|
|
|
//获取文件的MD5 |
|
private string getFileHash(string filePath) |
|
{ |
|
try |
|
{ |
|
FileStream stream = new FileStream(filePath, FileMode.Open); |
|
int length = (int)stream.Length; |
|
byte[] buffer = new byte[length]; |
|
stream.Read(buffer, 0, length); |
|
stream.Close(); |
|
byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(buffer); |
|
string str = string.Empty; |
|
foreach (byte num2 in buffer2) |
|
{ |
|
str = str + Convert.ToString(num2, 0x10); |
|
} |
|
return str; |
|
} |
|
catch (FileNotFoundException exception) |
|
{ |
|
Console.WriteLine(exception.Message); |
|
return string.Empty; |
|
} |
|
} |
|
//保存资源版本配置文件 |
|
private void SaveVersionFile(Dictionary<string, string> data,string fileVersionPath) |
|
{ |
|
if (File.Exists(fileVersionPath)) |
|
{ |
|
File.Delete(fileVersionPath); |
|
} |
|
XmlDocument document = new XmlDocument(); |
|
XmlDeclaration xmldecl = document.CreateXmlDeclaration("1.0", "UTF-8", "yes"); |
|
document.AppendChild(xmldecl); |
|
XmlElement newChild = document.CreateElement("Files"); |
|
document.AppendChild(newChild); |
|
foreach (KeyValuePair<string, string> pair in data) |
|
{ |
|
XmlElement element2 = document.CreateElement("File"); |
|
newChild.AppendChild(element2); |
|
element2.SetAttribute("FileName", pair.Key); |
|
element2.SetAttribute("Hash", pair.Value); |
|
} |
|
document.Save(fileVersionPath); |
|
document = null; |
|
} |
|
//获取xml文件版本信息 |
|
private Dictionary<string, string> getMainFileVersion(string path) |
|
{ |
|
Dictionary<string, string> fileHashID = new Dictionary<string, string>(); |
|
XmlDocument document = new XmlDocument(); |
|
document.Load(path); |
|
XmlNodeList nodeList = document.SelectSingleNode("Files").ChildNodes; |
|
foreach (XmlElement fileNode in nodeList) |
|
{ |
|
var fileName = fileNode.GetAttribute("FileName"); |
|
var fileHash = fileNode.GetAttribute("Hash"); |
|
fileHashID.Add(fileName, fileHash); |
|
} |
|
document = null; |
|
return fileHashID; |
|
} |
|
public SaveData CheckUpdate(string preFileXml,string curFileXml) |
|
{ |
|
SaveData data = new SaveData(); |
|
//获取本地的HashID |
|
Dictionary<string, string> preHashID = getMainFileVersion(preFileXml); |
|
//获取最新的HashID |
|
Dictionary<string, string> curHashID = getMainFileVersion(curFileXml); |
|
|
|
foreach(string fileName in curHashID.Keys) |
|
{ |
|
//1、先判断本地资源列表是否存在,若不存在则属于新资源 |
|
if (!preHashID.ContainsKey(fileName)) |
|
{ |
|
data.updateList.Add(fileName); |
|
} |
|
//2、再判断HashID是否相等,若不等则属于新资源 |
|
else if (preHashID[fileName] != curHashID[fileName]) |
|
{ |
|
data.updateList.Add(fileName); |
|
} |
|
} |
|
foreach(string fileName in preHashID.Keys) |
|
{ |
|
//若不存在则属于应删除的资源 |
|
if (!curHashID.ContainsKey(fileName)) |
|
{ |
|
data.delList.Add(fileName); |
|
} |
|
} |
|
return data; |
|
} |
|
/// <summary> |
|
/// 文件移动 |
|
/// </summary> |
|
/// <param name="sourceFile"></param> |
|
/// <param name="targetFile"></param> |
|
public void FileMove(string sourceFile, string targetFile) |
|
{ |
|
if (File.Exists(targetFile)) |
|
{ |
|
File.Delete(targetFile); |
|
} |
|
else |
|
{ |
|
string directoryName = Path.GetDirectoryName(targetFile); |
|
if (!Directory.Exists(directoryName) && directoryName != "") |
|
{ |
|
Directory.CreateDirectory(directoryName); |
|
} |
|
} |
|
try |
|
{ |
|
File.Move(sourceFile, targetFile); |
|
} |
|
catch (Exception exception) |
|
{ |
|
Debug.LogError(exception.Message); |
|
} |
|
} |
|
} |
|
public class SaveData |
|
{ |
|
public List<string> updateList; |
|
public List<string> delList; |
|
public SaveData() |
|
{ |
|
updateList = new List<string>(); |
|
delList = new List<string>(); |
|
} |
|
}
|
|
|