//字符串md5 public static string MD5String(string text) { if (string.IsNullOrEmpty(text)) { return(""); } try { byte[] data = System.Text.Encoding.Default.GetBytes(text);//将字符编码为一个字节序列 System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(data); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return(sb.ToString()); } catch (Exception ex) { UpdateLog.ERROR_LOG("calc md5 fail : " + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } return(""); }
/// <summary> /// 从文件解析 /// </summary> /// <param name="path"></param> /// <returns></returns> public int parseLocalVersionXml(string path) { UpdateLog.INFO_LOG(_TAG + "parseLocalVersionXml(string path): " + path); int ret = CodeDefine.RET_SUCCESS; try { var sp = MonoXmlUtils.LoadXmlEx(path); if (sp == null || sp.ToXml() == null) { UpdateLog.ERROR_LOG(_TAG + "File not exist or invalid: " + path); return(CodeDefine.RET_FAIL_PARSE_LOCAL_XML_FILE); } dom = sp.ToXml(); _localVersionXml = path; parse(dom); } catch (System.Exception ex) { ret = CodeDefine.RET_FAIL_PARSE_LOCAL_XML_FILE; UpdateLog.ERROR_LOG(_TAG + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } return(ret); }
/// <summary> /// 下载单个文件 /// </summary> /// <param name="savePath">保存路径</param> /// <param name="url">下载地址</param> /// <param name="isContinue">是否断点续传</param> /// <param name="isRetryAllways">失败后是否一直重试</param> /// <returns>小于0失败</returns> public int DownloadFile(string savePath, string url, bool isContinue = true) { UpdateLog.INFO_LOG(_TAG + "DownloadFile(string strFileName, string url, bool isContinue = true) : " + savePath + "," + url + "," + isContinue); int downloadRet = CodeDefine.RET_FAIL; long SPosition = 0; //如果本地有下载文件,则判断是否断点续传 FileStream FStream = null; try { ExistFileSize = 0; if (File.Exists(savePath) && isContinue) { //定向文件写入位置 FStream = File.Open(savePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); SPosition = FStream.Length; FStream.Seek(SPosition, SeekOrigin.Current); //已存在文件大小 ExistFileSize = (int)SPosition; } else { FStream = new FileStream(savePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); SPosition = 0; } //开始下载 downloadRet = HttpDownload(url, FStream, SPosition); if (FStream.CanWrite) { FStream.Close(); } Thread.Sleep(_SLEEP_TIME); } catch (System.Exception ex) { UpdateLog.ERROR_LOG(ex.Message); UpdateLog.EXCEPTION_LOG(ex); } finally { if (FStream != null && FStream.CanWrite) { FStream.Close(); } } return(downloadRet); }
/// <summary> /// 保存文件 /// </summary> /// <param name="baseVersion"></param> /// <param name="patchVersion"></param> /// <param name="hasCopy"></param> /// <param name="appVersion"></param> /// <returns></returns> public int save(string baseVersion = "", string patchVersion = "", string hasCopy = "", string appVersion = "") { UpdateLog.INFO_LOG(_TAG + "save()"); int ret = CodeDefine.RET_SUCCESS; bool hasChange = false; try { if (!"".Equals(baseVersion) && baseVersion != _baseResVersion) { _baseResVersion = baseVersion; set(dom, "local_info/local_base_res_version", baseVersion); hasChange = true; } if (!"".Equals(patchVersion) && patchVersion != _patchResVersion) { _patchResVersion = patchVersion; hasChange = true; set(dom, "local_info/local_patch_res_version", patchVersion); } if (!"".Equals(hasCopy) && hasCopy != _hasCopy) { _hasCopy = hasCopy; hasChange = true; set(dom, "local_info/hasCopy", hasCopy); } if (!"".Equals(appVersion) && appVersion != _localAppVersion) { _localAppVersion = appVersion; hasChange = true; set(dom, "local_info/local_app_version", appVersion); } if (hasChange) { MonoXmlUtils.SaveXml(_localVersionXml, dom); } else { UpdateLog.DEBUG_LOG("没有改动,不保存localversion.xml"); } } catch (System.Exception ex) { ret = CodeDefine.RET_FAIL_SAVE_LOCAL_XML_FILE; UpdateLog.ERROR_LOG(_TAG + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } return(ret); }
/// <summary> /// 从xml内容解析 /// </summary> /// <param name="xmlText"></param> /// <returns></returns> public int ParseFromText(string xmlText) { try { var rootNode = MonoXmlUtils.GetRootNodeFromString(xmlText); parse(rootNode); } catch (System.Exception ex) { UpdateLog.ERROR_LOG(ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); return(CodeDefine.RET_FAIL); } return(CodeDefine.RET_SUCCESS); }
/// <summary> /// 下载函数 /// </summary> /// <param name="url">地址</param> /// <param name="outFile">输入路径</param> /// <param name="begin">起点</param> /// <param name="end">终点</param> /// <returns>小于0失败</returns> public int HttpDownload(string url, FileStream outFile, long begin = 0, long end = 0) { int num = CodeDefine.RET_INIT; _requestIns = null; try { DownloadUrl = url; _requestIns = createRequest(url); setRange(_requestIns, (int)begin, (int)end); requestData(_requestIns, outFile); num = CodeDefine.RET_SUCCESS; } catch (Exception exception) { UpdateLog.WARN_LOG("catch http instance exception :::" + exception.Message); if (!_isAbortOption) { UpdateLog.ERROR_LOG(_TAG + exception.Message + "\n" + exception.StackTrace); UpdateLog.EXCEPTION_LOG(exception); num = CodeDefine.RET_FAIL_EXCEPTION_DOWNLOAD; } UpdateLog.ERROR_LOG("HttpDownload: " + outFile.Name); } finally { if ((outFile != null) && outFile.CanWrite) { outFile.Close(); } _requestIns = null; if (_isAbortOption) { num = CodeDefine.RET_SKIP_BY_ABORT; } } _isAbortOption = false; if (MapFileData != null) { MapFileData.ErrorCode = num; } return(num); }
private static int DownloadMapData(MapFileData fileData, string saveFilePath) { int code = CodeDefine.RET_INIT; try { lock (m_locker) { if (!Directory.Exists(fileData.SaveDir + "/" + fileData.Dir)) { Directory.CreateDirectory(fileData.SaveDir + "/" + fileData.Dir); } } long begin = fileData.Begin + 4 * 32 + fileData.DirLen + fileData.NameLen + fileData.Md5Len; long end = fileData.End - 1; int retryTimes = _RETRAY_TIMES; while ((retryTimes > 0) && (code <= CodeDefine.RET_INIT)) { retryTimes--; if (fileData.Name.Contains("RemoteVersion.xml") || fileData.Name.ToLower().Contains("localversion.xml")) { return(CodeDefine.RET_SUCCESS); } code = DownloadUseBackCdn(fileData, fileData.ResUrl, saveFilePath, begin, end); if (code == CodeDefine.RET_SKIP_BY_ABORT) { break; } } } catch (Exception exception) { if (saveFilePath.Contains("ClassesResources.xml")) { code = CodeDefine.RET_SUCCESS; } UpdateLog.ERROR_LOG(_TAG + "ThreadCallBack(object state) download fail: file= " + saveFilePath + "\n error" + exception.Message + "\n" + exception.StackTrace); UpdateLog.EXCEPTION_LOG(exception); } return(code); }
//文件md5 public static string MD5File(string filePath) { if (!File.Exists(filePath)) { return(""); } // MD5 md5 = new MD5CryptoServiceProvider(); // byte[] data = System.Text.Encoding.Default.GetBytes(filePath);//将字符编码为一个字节序列 // byte[] md5data = md5.ComputeHash(data);//计算data字节数组的哈希值 // md5.Clear(); // string str = ""; // for (int i = 0; i < md5data.Length; i++) // { // str += md5data[i].ToString("x2"); // } // return str; try { FileStream file = new FileStream(filePath, FileMode.Open); System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.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) { UpdateLog.ERROR_LOG("calc md5 fail : " + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } return(""); }
/// <summary> /// 保存 /// </summary> /// <param name="localVersion"></param> /// <returns></returns> public int save(LocalVersionXml localVersion) { UpdateLog.INFO_LOG(_TAG + "save()"); int ret = CodeDefine.RET_SUCCESS; try { set(dom, "local_info/local_base_res_version", localVersion.BaseResVersion); set(dom, "local_info/local_patch_res_version", localVersion.PatchResVersion); set(dom, "local_info/hasCopy", localVersion.HasCopy); set(dom, "local_info/local_app_version", localVersion.LocalAppVersion); MonoXmlUtils.SaveXml(_localVersionXml, dom); } catch (System.Exception ex) { ret = CodeDefine.RET_FAIL_SAVE_LOCAL_XML_FILE; UpdateLog.ERROR_LOG(_TAG + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } return(ret); }
private int downloadMapData(MapFileData fileData, string saveFilePath) { int ret = CodeDefine.RET_FAIL; try { lock (m_locker) { if (!Directory.Exists(fileData.SaveDir + "/" + fileData.Dir)) { Directory.CreateDirectory(fileData.SaveDir + "/" + fileData.Dir); } } //计算下载点,在资源包中,每个文件都有4个32字节的数据头加上文件名、md5长度,要跳过 long begin = fileData.Begin + 32 * 4 + fileData.DirLen + fileData.NameLen + fileData.Md5Len; //http的AddRange方法是闭包的,所以减一。([from, to]) long end = fileData.End - 1; //每个文件有3次下载机会 int i = _RETRAY_TIMES; while (i > 0) { i--; if (fileData.Name.Contains("RemoteVersion.xml") || fileData.Name.ToLower().Contains("localversion.xml")) { ret = CodeDefine.RET_SUCCESS; return(ret); } if (Download.UseBackupCdn(fileData.ResUrl, Download.BackupCdn)) { //使用台湾备份cdn地址 for (int cdnIndex = 0; cdnIndex < Download.BackupCdn.Length; ++cdnIndex) { string backupUrl = fileData.ResUrl.Replace(Download.BackupCdn[0], Download.BackupCdn[cdnIndex]); using (FileStream outFile = new FileStream(saveFilePath, FileMode.Create)) { ret = httpDownload(backupUrl, outFile, begin, end); if (ret >= CodeDefine.RET_SUCCESS) { break; } if (ret == CodeDefine.RET_SKIP_BY_ABORT) { return(ret); } } } if (ret >= CodeDefine.RET_SUCCESS) { break; } } else { using (FileStream outFile = new FileStream(saveFilePath, FileMode.Create)) { //UpdateLog.INFO_LOG(_TAG + " download: " + saveFilePath); ret = httpDownload(fileData.ResUrl, outFile, begin, end); if (ret >= CodeDefine.RET_SUCCESS) { break; } if (ret == CodeDefine.RET_SKIP_BY_ABORT) { return(ret); } UpdateLog.WARN_LOG(_TAG + " try download i = " + i); Thread.Sleep(_SLEEP_TIME); } } } } catch (System.Exception ex) { if (saveFilePath.Contains("ClassesResources.xml")) { ret = CodeDefine.RET_SUCCESS; } UpdateLog.ERROR_LOG(_TAG + "ThreadCallBack(object state) download fail: file= " + saveFilePath + "\n error" + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } return(ret); }
public int parseMapFile(string mapFile, string resUrl, string saveDir) { _saveDir = saveDir; UpdateLog.INFO_LOG(_TAG + "parseMapFile(string mapFile, string resUrl):" + mapFile + "," + resUrl); int ret = CodeDefine.RET_SUCCESS; List <MapFileData> mapFileDataList = _mapFileDataList; FileStream mapFileStream = null; try { mapFileStream = new FileStream(mapFile, FileMode.Open); long filePosition = 0; long mapFileSize = mapFileStream.Length; while (mapFileSize > 0 && filePosition != mapFileSize) { if (filePosition >= mapFileSize) { UpdateLog.ERROR_LOG("解析出错了"); return(ret); } MapFileData mapFileData = new MapFileData(); mapFileData.Begin = parseInt(read(mapFileStream, 10, filePosition, out filePosition)); if (mapFileData.Begin == -1) { UpdateLog.WARN_LOG("解析map文件,出现异常,请检查: " + mapFile); return(ret); } mapFileData.End = parseInt(read(mapFileStream, 10, filePosition, out filePosition)); mapFileData.DirLen = parseInt(read(mapFileStream, 10, filePosition, out filePosition)); mapFileData.NameLen = parseInt(read(mapFileStream, 10, filePosition, out filePosition)); mapFileData.Md5Len = parseInt(read(mapFileStream, 10, filePosition, out filePosition)); mapFileData.FileSize = parseInt(read(mapFileStream, 10, filePosition, out filePosition)); mapFileData.Dir = read(mapFileStream, mapFileData.DirLen, filePosition, out filePosition); mapFileData.Name = read(mapFileStream, mapFileData.NameLen, filePosition, out filePosition); mapFileData.Md5 = read(mapFileStream, mapFileData.Md5Len, filePosition, out filePosition); mapFileData.ResUrl = resUrl; mapFileData.SaveDir = _saveDir; UnityEngine.Debug.Log("mapFileData.Name :" + mapFileData.Name); mapFileDataList.Add(mapFileData); } } catch (System.Exception ex) { ret = CodeDefine.RET_FAIL_PARSE_MAP_FILE; UpdateLog.ERROR_LOG(_TAG + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } finally { if (mapFileStream != null) { mapFileStream.Close(); } } return(ret); }
/// <summary> /// 释放资源 /// 文件结构 4x32 文件头 |32位记录路径长度|32位记录文件名|32位记录md5长度|32位记录文件大小| /// 然后根据这4个结构获取具体的路径、文件名、md5值、文件内容 /// </summary> /// <returns></returns> public int UnzipRes() { UpdateLog.INFO_LOG(_TAG + "unzipRes()"); int ret = CodeDefine.RET_SUCCESS; FileStream resFileStream = null; long filePostion = 0; long fileSize = 0; try { resFileStream = new FileStream(_resPath, FileMode.Open, FileAccess.Read, FileShare.Read); fileSize = resFileStream.Length; List <ResourceFileData> fileDataList = new List <ResourceFileData>(); //启动线程池 // var threadPool = new HttpThreadPool<UnzipData>(4, ThreadFunc); while (fileSize > 0 && filePostion < fileSize) { ResourceFileData fileData = new ResourceFileData(); //4x32长度的头 fileData.DirLen = int.Parse(read(resFileStream, 32, filePostion, out filePostion)); fileData.NameLen = int.Parse(read(resFileStream, 32, filePostion, out filePostion)); fileData.Md5Len = int.Parse(read(resFileStream, 32, filePostion, out filePostion)); fileData.FileSize = long.Parse(read(resFileStream, 32, filePostion, out filePostion)); //读取内容 fileData.Dir = read(resFileStream, fileData.DirLen, filePostion, out filePostion); fileData.Name = read(resFileStream, fileData.NameLen, filePostion, out filePostion); fileData.Md5 = read(resFileStream, fileData.Md5Len, filePostion, out filePostion); //跳过localversion的释放 if (fileData.Name.ToLower().Equals("localversion.xml")) { resFileStream.Seek(fileData.FileSize, SeekOrigin.Current); } else { writeFile(resFileStream, fileData.FileSize, fileData.Dir, fileData.Name); //resFileStream.Seek(fileData.FileSize, SeekOrigin.Current); //UnzipData ud = new UnzipData(fileData, filePostion, fileSize); //threadPool.addTask(ud); } filePostion += fileData.FileSize; } //等待所有文件下载完 //threadPool.waitWhileWorking(); } catch (System.Exception ex) { ret = CodeDefine.RET_FAIL_UNZIP_RES_FILE; UpdateLog.ERROR_LOG(_TAG + ex.Message + "\n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } finally { if (resFileStream != null) { resFileStream.Close(); } } return(ret); }
//解析xml public int parseResouceVersionXml(string path) { UpdateLog.INFO_LOG(_TAG + "parseResouceVersionXml(string path):" + path); int ret = CodeDefine.RET_SUCCESS; try { var sp = MonoXmlUtils.LoadXmlEx(path); if (sp == null || sp.ToXml() == null) { return(CodeDefine.RET_FAIL_PARSE_RES_XML_FILE); } var dom = sp.ToXml(); //正式流程 parse(dom, "ResourceVersion/VersionBase", NormalFollow.VersionModelBaseList); parse(dom, "ResourceVersion/VersionPatch", NormalFollow.VersionModelPatchList); NormalFollow.AppVersion = parse(dom, "ResourceVersion/CodeVersion_last/Version"); NormalFollow.ClientUrl = parse(dom, "ResourceVersion/CodeVersion_last/url"); NormalFollow.AppSize = parse(dom, "ResourceVersion/CodeVersion_last/size"); NormalFollow.Language = parse(dom, "ResourceVersion/loginSever/language"); bool enable = true; if (!Boolean.TryParse(parse(dom, "ResourceVersion/ForceUpdate"), out enable)) { enable = true; } NormalFollow.EnableForceUpdate = enable; NormalFollow.PatchVersion = GetMaxPatchVersion(NormalFollow.VersionModelPatchList); //测试流程 parse(dom, "ResourceVersion/test_tag/VersionBase", TestFollow.VersionModelBaseList); parse(dom, "ResourceVersion/test_tag/VersionPatch", TestFollow.VersionModelPatchList); TestFollow.AppVersion = parse(dom, "ResourceVersion/test_tag/app_current_version"); TestFollow.ClientUrl = parse(dom, "ResourceVersion/test_tag/app_update_url"); TestFollow.AppSize = parse(dom, "ResourceVersion/test_tag/test_size"); TestFollow.Language = parse(dom, "ResourceVersion/test_tag/language"); if (!Boolean.TryParse(parse(dom, "ResourceVersion/test_tag/ForceUpdate"), out enable)) { enable = true; } TestFollow.EnableForceUpdate = enable; TestFollow.PatchVersion = GetMaxPatchVersion(TestFollow.VersionModelPatchList); //白名单 mac地址 var macList = parseNodes(dom, "ResourceVersion/test_tag/legal_client_machine_list/legal_client_machine"); for (int i = 0; macList != null && i < macList.Length; i++) { if (macList[i] == null) { continue; } WhiteCode.Add(macList[i].Text); } //白名单 用户名 var userList = parseNodes(dom, "ResourceVersion/test_tag/legal_client_user_list/legal_client_user"); for (int i = 0; userList != null && i < userList.Length; i++) { if (userList[i] == null) { continue; } WhiteUsers.Add(userList[i].Text); } //白名单 ip地址 var ipList = parseNodes(dom, "ResourceVersion/test_tag/legal_client_ip_list/legal_client_ip"); for (int i = 0; ipList != null && i < ipList.Length; i++) { if (ipList[i] == null) { continue; } WhiteIp.Add(ipList[i].Text); } } catch (System.Exception ex) { ret = CodeDefine.RET_FAIL_PARSE_RES_XML_FILE; UpdateLog.ERROR_LOG(_TAG + ex.Message + "/n" + ex.StackTrace); UpdateLog.EXCEPTION_LOG(ex); } return(ret); }