海淀天下城电子沙盘单机版
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

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>();
}
}