public void SetFileLastModifyTime(string url, ref DateTime dt) { string key = CFileManager.GetMd5(url.ToLower()); CCachedFileInfo cacheFileInfo = m_cachedFileInfoSet.GetFileInfo(key); if (cacheFileInfo != null) { cacheFileInfo.m_lastModifyTime = dt; } }
//-------------------------------------------------- /// 添加数据 /// @url /// @data //-------------------------------------------------- public void AddFileInfo(string key, CCachedFileInfo cachedTextureInfo) { if (m_cachedFileInfoMap.ContainsKey(key)) { return; } if (m_cachedFileInfos != null) { m_cachedFileInfoMap.Add(key, cachedTextureInfo); m_cachedFileInfos.Add(cachedTextureInfo); } }
//-------------------------------------------------- /// 返回缓存文件信息 /// @key //-------------------------------------------------- public CCachedFileInfo GetFileInfo(string key) { CCachedFileInfo cachedFileInfo = null; if (m_cachedFileInfoMap.TryGetValue(key, out cachedFileInfo)) { return(cachedFileInfo); } else { return(null); } }
//-------------------------------------------------- /// 移除最早的数据 /// @return key //-------------------------------------------------- public string RemoveEarliestFileInfo() { if (m_cachedFileInfos == null || m_cachedFileInfos.Count <= 0) { return(null); } CCachedFileInfo removeCachedFileInfo = m_cachedFileInfos[0]; m_cachedFileInfos.RemoveAt(0); m_cachedFileInfoMap.Remove(removeCachedFileInfo.m_key); return(removeCachedFileInfo.m_key); }
public DateTime GetFileLastModifyTime(string url) { string key = CFileManager.GetMd5(url.ToLower()); CCachedFileInfo cacheFileInfo = m_cachedFileInfoSet.GetFileInfo(key); if (cacheFileInfo != null) { return(cacheFileInfo.m_lastModifyTime); } else { return(DateTime.MinValue); } }
//-------------------------------------- /// 排序函数 /// @按m_lastModifyTime升序排列 //-------------------------------------- public int CompareTo(object obj) { CCachedFileInfo cachedTextureInfo = obj as CCachedFileInfo; if (m_lastModifyTime > cachedTextureInfo.m_lastModifyTime) { return(1); } else if (m_lastModifyTime == cachedTextureInfo.m_lastModifyTime) { return(0); } else { return(-1); } }
//-------------------------------------------------- /// 读出数据 /// @buffer /// @offset /// @dataLength //-------------------------------------------------- public int Read(byte[] buffer, int offset, uint dataLength) { m_cachedFileInfos.Clear(); m_cachedFileInfoMap.Clear(); //数据长度不合法,不能读取数据 if (dataLength < 6 || offset + (int)dataLength > buffer.Length) { return(-1); } //校验数据长度 int storedDataLength = CMemoryManager.ReadInt(buffer, ref offset); if (storedDataLength < 6 || storedDataLength != (int)dataLength) { return(-2); } //校验版本号 int version = CMemoryManager.ReadShort(buffer, ref offset); if (version != c_version) { return(-3); } //读取数据 int infoAmount = CMemoryManager.ReadShort(buffer, ref offset); for (int i = 0; i < infoAmount; i++) { CCachedFileInfo cacheFileInfo = new CCachedFileInfo(); cacheFileInfo.Read(buffer, ref offset); //防止key重复 if (m_cachedFileInfoMap.ContainsKey(cacheFileInfo.m_key) == false) { m_cachedFileInfoMap.Add(cacheFileInfo.m_key, cacheFileInfo); m_cachedFileInfos.Add(cacheFileInfo); } } //按最后修改时间排序 m_cachedFileInfos.Sort(); return(0); }
//-------------------------------------------------- /// 获取缓存的资源文件路径 /// @url : 地址 /// @validDays : 有效天数 //-------------------------------------------------- public string GetCachedFilePath(string url, float validDays) { string key = CFileManager.GetMd5(url.ToLower()); CCachedFileInfo cachedFileInfo = m_cachedFileInfoSet.GetFileInfo(key); //不存在 if (cachedFileInfo == null) { return(string.Empty); } //检查是否过期 if ((DateTime.Now - cachedFileInfo.m_lastModifyTime).TotalDays >= validDays) { RemoveFile(key); return(string.Empty); } string cachedFileFullPath = CFileManager.CombinePath(m_dir, key + m_fileExtension); //检查文件是否存在 if (CFileManager.IsFileExist(cachedFileFullPath)) { //通过校验文件长度,来判断是否被串改 if (cachedFileInfo.m_fileLength == (int)CFileManager.GetFileLength(cachedFileFullPath)) { return(cachedFileFullPath); } else { RemoveFile(key); } } return(string.Empty); }
//-------------------------------------------------- /// 添加缓存文件 /// @url /// @cacheType /// @width /// @height /// @isGif /// @data //-------------------------------------------------- public void AddFile(string url, byte[] data, int tagInt1 = 0, int tagInt2 = 0, bool tagBool = false) { string key = CFileManager.GetMd5(url.ToLower()); List <CCachedFileInfo> cachedFileInfoList = m_cachedFileInfoSet.m_cachedFileInfos; if (cachedFileInfoList == null) { return; } if (m_cachedFileInfoSet.m_cachedFileInfoMap.ContainsKey(key)) { CCachedFileInfo cachedFileInfo = null; m_cachedFileInfoSet.m_cachedFileInfoMap.TryGetValue(key, out cachedFileInfo); Debug.Assert(cachedFileInfoList != null && cachedFileInfoList.Contains(cachedFileInfo), "zen me ke neng?"); //修改信息 cachedFileInfo.m_fileLength = data.Length; cachedFileInfo.m_lastModifyTime = DateTime.Now; cachedFileInfo.m_tagInt1 = tagInt1; cachedFileInfo.m_tagInt2 = tagInt2; cachedFileInfo.m_tagBool = tagBool; } else { //如果数量达到上限,移除排在最前面的文件 if (cachedFileInfoList.Count >= m_maxCnt) { string removeKey = m_cachedFileInfoSet.RemoveEarliestFileInfo(); //删除缓存文件 if (!string.IsNullOrEmpty(removeKey)) { string removeCachedFileFullPath = CFileManager.CombinePath(m_dir, removeKey + m_fileExtension); if (CFileManager.IsFileExist(removeCachedFileFullPath)) { CFileManager.DeleteFile(removeCachedFileFullPath); } } } CCachedFileInfo cachedFileInfo = new CCachedFileInfo(); cachedFileInfo.m_key = key; cachedFileInfo.m_fileLength = data.Length; cachedFileInfo.m_lastModifyTime = DateTime.Now; cachedFileInfo.m_tagInt1 = tagInt1; cachedFileInfo.m_tagInt2 = tagInt2; cachedFileInfo.m_tagBool = tagBool; m_cachedFileInfoSet.AddFileInfo(key, cachedFileInfo); } //排序 m_cachedFileInfoSet.m_cachedFileInfos.Sort(); //写入信息文件 byte[] buffer = CFileManager.LockFileBuffer(); try { MakeDirReady(); int offset = 0; m_cachedFileInfoSet.Write(buffer, ref offset); if (CFileManager.IsFileExist(m_metaFilePath)) { CFileManager.DeleteFile(m_metaFilePath); } CFileManager.WriteFile(m_metaFilePath, buffer, 0, offset); } finally { CFileManager.UnLockFileBuffer(); } //写入数据文件 string cachedFileFullPath = CFileManager.CombinePath(m_dir, key + m_fileExtension); if (CFileManager.IsFileExist(cachedFileFullPath)) { CFileManager.DeleteFile(cachedFileFullPath); } CFileManager.WriteFile(cachedFileFullPath, data); }