static void WriteABMD5() { DirectoryInfo directoryInfo = new DirectoryInfo(m_BunleTargetPath); FileInfo[] files = directoryInfo.GetFiles("*", SearchOption.AllDirectories); ABMD5 abmd5 = new ABMD5(); abmd5.ABMD5List = new List <ABMD5Base> (); for (int i = 0; i < files.Length; i++) { if (!files[i].Name.EndsWith(".meta") && !files[i].Name.EndsWith(".manifest")) { ABMD5Base abmd5Base = new ABMD5Base(); abmd5Base.Name = files[i].Name; abmd5Base.MD5 = MD5Manager.Instance.BuildFileMd5(files[i].FullName); abmd5Base.Size = files[i].Length / 1024.0f; abmd5.ABMD5List.Add(abmd5Base); } } string ABMD5Path = Application.dataPath + "/Resources/ABMD5.bytes"; BinarySerializeOpt.BinarySerilize(ABMD5Path, abmd5); //将打版的版本拷贝到外部进行储存 if (!Directory.Exists(m_VersionMd5Path)) { Directory.CreateDirectory(m_VersionMd5Path); } string targetPath = m_VersionMd5Path + "/ABMD5_" + PlayerSettings.bundleVersion + ".bytes"; if (File.Exists(targetPath)) { File.Delete(targetPath); } File.Copy(ABMD5Path, targetPath); }
/// <summary> /// 读取MD5 /// </summary> public static void ReadABMD5(string path, string hotCount) { if (!File.Exists(path)) { Debug.LogError("读取的Md5二进制文件不存在"); return; } //旧版本的资源信息 m_ABMD5BaseDir.Clear(); using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { BinaryFormatter bf = new BinaryFormatter(); ABMD5 md5 = (ABMD5)bf.Deserialize(fs); for (int i = 0; i < md5.ABMD5BaseList.Count; i++) { m_ABMD5BaseDir.Add(md5.ABMD5BaseList[i].Name, md5.ABMD5BaseList[i]); } } //筛选更新的新版的资源 List <string> changeList = new List <string>(); string[] files = Directory.GetFiles(m_BuildABPath); for (int i = 0; i < files.Length; i++) { //剔除不需要的文件 if (files[i].EndsWith(".meta") || files[i].EndsWith(".manifest")) { continue; } FileInfo fi = new FileInfo(files[i]); //新增的 if (!m_ABMD5BaseDir.ContainsKey(fi.Name)) { changeList.Add(fi.Name); } else { ABMD5Base md5base = null; if (m_ABMD5BaseDir.TryGetValue(fi.Name, out md5base)) { //改过的 string md5 = MD5Manager.Instance.BuildFileMd5(fi.FullName); if (md5base.Md5 != md5) { changeList.Add(fi.Name); } } } } //复制到制定的文件家,并序列化成XML CopyHotAssetAndCreateXml(changeList, hotCount); }
/// <summary> /// 保存AssetBundleMd5信息 /// </summary> public static void WriteABMd5() { //找到打包后Assetbundle的文件信息 ABMD5 abmds = new ABMD5(); abmds.ABMD5BaseList = new List <ABMD5Base>(); string[] files = Directory.GetFiles(m_BuildABPath); for (int i = 0; i < files.Length; i++) { //剔除不需要的文件 if (files[i].EndsWith(".meta") || files[i].EndsWith(".manifest")) { continue; } FileInfo file = new FileInfo(files[i]); ABMD5Base ab = new ABMD5Base(); ab.Name = file.Name; ab.Md5 = MD5Manager.Instance.BuildFileMd5(file.FullName); ab.Size = file.Length / 1024.0f; abmds.ABMD5BaseList.Add(ab); } //序列化成二进制文件 string path = Application.dataPath + "/Resources/ABMD5.bytes"; if (File.Exists(path)) { File.Delete(path); } FileStream fs1 = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs1, abmds); fs1.Close(); //将写好的版本数据Copy到外不存储 if (!Directory.Exists(m_ABMD5VersionPath)) { Directory.CreateDirectory(m_ABMD5VersionPath); } string targetFile = m_ABMD5VersionPath + "/ABMD5" + PlayerSettings.bundleVersion + ".bytes"; if (File.Exists(targetFile)) { File.Delete(targetFile); } File.Copy(path, targetFile); }
static void ReadMd5Com(string abmd5Path, string hotCount, string des) { mpackedMd5.Clear(); using (FileStream fileStream = new FileStream(abmd5Path, FileMode.Open, FileAccess.Read)) { BinaryFormatter bf = new BinaryFormatter(); ABMD5 abmd5 = new ABMD5(); abmd5.ABMD5List = new List <ABMD5Base>(); if (fileStream.Length != 0) { abmd5 = bf.Deserialize(fileStream) as ABMD5; } foreach (ABMD5Base abmd5Base in abmd5.ABMD5List) { mpackedMd5.Add(abmd5Base.Name, abmd5Base); } } List <string> changeList = new List <string>(); DirectoryInfo directory = new DirectoryInfo(BundleTargetPath); FileInfo[] files = directory.GetFiles("*", SearchOption.AllDirectories); for (int i = 0; i < files.Length; i++) { if (!files[i].Name.EndsWith(".meta") && !files[i].Name.EndsWith(".manifest")) { string name = files[i].Name; string md5 = Utility.FileHelper.GetMD5HashFromFile(files[i].FullName); ABMD5Base abmd5Base = null; if (!mpackedMd5.ContainsKey(name)) { changeList.Add(name); } else { if (mpackedMd5.TryGetValue(name, out abmd5Base)) { if (md5 != abmd5Base.Md5) { changeList.Add(name); } } } } } CopyABAndGeneratXml(changeList, hotCount, des); }
/// <summary> /// 读取本地资源MD5码 /// </summary> void ReadMD5() { m_PackedMd5.Clear(); TextAsset md5 = Resources.Load <TextAsset> ("ABMD5"); if (md5 == null) { Debug.LogError("未读取到本地MD5"); return; } using (MemoryStream stream = new MemoryStream(md5.bytes)) { BinaryFormatter bf = new BinaryFormatter(); ABMD5 abmd5 = bf.Deserialize(stream) as ABMD5; foreach (ABMD5Base abmd5Base in abmd5.ABMD5List) { m_PackedMd5.Add(abmd5Base.Name, abmd5Base); } } }