本地配置文件,或要做热更的文件,通过计算文件md5与保存在服务器端的值做对比,如果不一致则说明本地文件过旧,或者被非法修改过。
算文件md5方法为:读取文件为二进制流,算出md5值转为字符串。
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace GetMD5
{
class Program
{
public static string getFileHash(string filePath)
{
try
{
FileStream fs = new FileStream(filePath, FileMode.Open);
int len = (int)fs.Length;
byte[] data = new byte[len];
fs.Read(data, 0, len);
fs.Close();
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(data);
string fileMD5 = "";
foreach (byte b in result)
{
fileMD5 += Convert.ToString(b, 16);
}
return fileMD5;
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
return "";
}
}
static void Main(string[] args)
{
string md5 = getFileHash("E:\\Myweb\\cubetest.unity3d");
string b = getFileHash("E:\\Myweb\\testscene.unity3d");
Console.WriteLine(md5);
Console.WriteLine(b);
Console.ReadKey();
}
}
}
或者:
using System.IO;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// 文件MD5计算器
/// </summary>
public class FileMD5Helper
{
#region 公共方法
/// <summary>
/// 计算文件的md5值,返回大写格式
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GenerateFileMD5Upper(string url)
{
if (File.Exists(url) == false)
return string.Empty;
byte[] fileByte = File.ReadAllBytes(url);
if (fileByte == null)
return string.Empty;
byte[] hashByte = new MD5CryptoServiceProvider().ComputeHash(fileByte);
return byteArrayToString(hashByte);
}
#endregion
#region 私有方法
/// <summary>
/// 输出数据的十六进制字符串
/// </summary>
/// <param name="arrInput"></param>
/// <returns></returns>
private static string byteArrayToString(byte[] arrInput)
{
StringBuilder sOutput = new StringBuilder(arrInput.Length);
for (int i = 0; i < arrInput.Length; i++)
{
sOutput.Append(arrInput[i].ToString("X2"));
}
return sOutput.ToString();
}
#endregion
}
参考:
http://blog.csdn.net/zjc_game_coder/article/details/20309505
http://blog.csdn.net/huang9012/article/details/38928753