当游戏需要做游戏的热更新时,就需要为文件生成MD5值,了解到这个前提以后,大家在学习本篇文章才能更容易,下面就来看下下载资源存储文件生成md5码的方法吧。
代码如下:
IEnumerator GetText()
{
using (UnityWebRequest request = UnityWebRequest.Get("localhost:80/txt/test.txt"))
{
yield return request.Send();
if (request.isError)
{
Debug.Log(request.error);
}
else
{
// Show results as text
Debug.Log(request.downloadHandler.text);
// Or retrieve results as binary data
byte[] data = request.downloadHandler.data;
//using (FileStream fs = new FileStream(path, FileMode.Create))
//{
// fs.Write(data, 0, data.Length);
// fs.Close();
// fs.Dispose();
//}
writeFile(path, "34.txt", data);
}
}
}
1、采用webrequest下载文件,最终文件下载得到的是一个byte[]数组
2、然后通过FileStream写文件的办法来存储文件,需要自己记录 文件名和后缀
/// <summary>
/// 获取webrequest下载的文件的byte[]来存储文件
/// </summary>
/// <param name="path"></param>
/// <param name="fileName"></param>
/// <param name="bytes"></param>
void writeFile(string path, string fileName, byte[] bytes)
{
FileStream fs = new FileStream(path + "//" + fileName, FileMode.Create); //打开一个写入流
//string str = "写入文件";
//byte[] bytes = Encoding.UTF8.GetBytes(str);
fs.Write(bytes, 0, bytes.Length);
fs.Flush(); //流会缓冲,此行代码指示流不要缓冲数据,立即写入到文件。
fs.Close(); //关闭流并释放所有资源,同时将缓冲区的没有写入的数据,写入然后再关闭。
fs.Dispose(); //释放流所占用的资源,Dispose()会调用Close(),Close()会调用Flush(); 也会写入缓冲区内的数据。
}
3、然后生成md5码用于资源差异对比
/// 获取文件的MD5码
/// </summary>
/// <param name="fileName">传入的文件名(含路径及后缀名)</param>
/// <returns></returns>
public string GetMD5HashFromFile(string fileName)
{
try
{
FileStream file = new FileStream(fileName, System.IO.FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
catch (Exception ex)
{
throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);
}
}
4、把这些信息写在一个Version.txt里面
信息包括 文件名、大小、MD5码
下载的时候拿到这个文件即可知道要下载哪些文件。
5、正式流程
- 下载远程Version.txt,获取其字符串
- 获取本地的Version.txt
- 如果本地不存在Version.txt,那么把要下载的文件路径存在一个字符串队列bundles里面
- 如果本地存在Version.txt,首先判断比较 删除服务器端没有的ab,然后把要下载的放在字符串队列bundles里面
- 遍历字符串队列bundles,挨个下载即可
- 最后存储最新的Version.txt文件