private bool CheckBackUpIndex() { var path = Path.GetDirectoryName(m_fileFullName); var fileName = Path.Combine(path, BACK_UP).Replace("\\", "/"); if (File.Exists(fileName)) { var fileInfo = new FileInfo(fileName); var fileSize = fileInfo.Length; var fileStream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); m_packageInfo = GetPackageInfo(fileStream, fileSize); if (m_packageInfo == null || m_packageInfo.IndexOffset == 0) return true; var indexSize = (int)(fileSize - PackageInfo.GetPackageSize());//计算索引信息大小 var indexData = new Byte[indexSize]; fileStream.Position = 0; fileStream.Read(indexData, 0, indexSize);//获取索引信息 LoadIndexInfo(indexData, false); return true; } else return false; }
/// <summary> /// 获取包信息。 /// </summary> /// <param name="fileSize"></param> private PackageInfo GetPackageInfo(FileStream fileStream, long fileSize) { var packageInfo = new PackageInfo(); if (fileSize < PackageInfo.GetPackageSize()) return new PackageInfo(); fileStream.Position = fileSize - PackageInfo.GetPackageSize();//索引信息起始位置存放在文件结尾处。 var lengthData = new Byte[PackageInfo.GetPackageSize()]; fileStream.Read(lengthData, 0, PackageInfo.GetPackageSize()); var index = 0; packageInfo.IndexOffset = EncodeDecoder.DecodeUInt32(lengthData, ref index);//获取索引信息起始位置 return packageInfo; }
/// <summary> /// 获取索引信息。 /// </summary> /// <param name="fileSize">文件包大小。</param> /// <param name="needBackUpIndex">是否备份索引信息。</param> private void GetIndexInfo(long fileSize, bool needBackUpIndex) { lock (m_locker) { m_packageInfo = GetPackageInfo(m_fileStream, fileSize); if (m_packageInfo == null || m_packageInfo.IndexOffset == 0) return; var indexSize = (int)(fileSize - PackageInfo.GetPackageSize() - m_packageInfo.IndexOffset);//计算索引信息大小 var indexData = new Byte[indexSize]; m_fileStream.Position = m_packageInfo.IndexOffset; m_fileStream.Read(indexData, 0, indexSize);//获取索引信息 LoadIndexInfo(indexData, needBackUpIndex); } }