/// <summary> /// 加载文件系统。 /// </summary> /// <param name="fullPath">要加载的文件系统的完整路径。</param> /// <param name="access">要加载的文件系统的访问方式。</param> /// <param name="stream">要加载的文件系统的文件系统流。</param> /// <returns>加载的文件系统。</returns> public static FileSystem Load(string fullPath, FileSystemAccess access, FileSystemStream stream) { FileSystem fileSystem = new FileSystem(fullPath, access, stream); stream.Read(s_CachedBytes, 0, HeaderDataSize); fileSystem.m_HeaderData = Utility.Marshal.BytesToStructure <HeaderData>(HeaderDataSize, s_CachedBytes); CalcOffsets(fileSystem); fileSystem.m_BlockDatas.Capacity = fileSystem.m_HeaderData.BlockCount; for (int i = 0; i < fileSystem.m_HeaderData.BlockCount; i++) { stream.Read(s_CachedBytes, 0, BlockDataSize); BlockData blockData = Utility.Marshal.BytesToStructure <BlockData>(BlockDataSize, s_CachedBytes); fileSystem.m_BlockDatas.Add(blockData); } for (int i = 0; i < fileSystem.m_BlockDatas.Count; i++) { BlockData blockData = fileSystem.m_BlockDatas[i]; if (blockData.Using) { StringData stringData = fileSystem.ReadStringData(blockData.StringIndex); fileSystem.m_StringDatas.Add(blockData.StringIndex, stringData); fileSystem.m_FileDatas.Add(stringData.GetString(fileSystem.m_HeaderData.GetEncryptBytes()), i); } else { fileSystem.m_FreeBlockIndexes.Add(blockData.Length, i); } } return(fileSystem); }
/// <summary> /// 加载文件系统。 /// </summary> /// <param name="fullPath">要加载的文件系统的完整路径。</param> /// <param name="access">要加载的文件系统的访问方式。</param> /// <param name="stream">要加载的文件系统的文件系统流。</param> /// <returns>加载的文件系统。</returns> public static FileSystem Load(string fullPath, FileSystemAccess access, FileSystemStream stream) { FileSystem fileSystem = new FileSystem(fullPath, access, stream); stream.Read(s_CachedBytes, 0, HeaderDataSize); fileSystem.m_HeaderData = Utility.Marshal.BytesToStructure <HeaderData>(HeaderDataSize, s_CachedBytes); if (!fileSystem.m_HeaderData.IsValid) { return(null); } CalcOffsets(fileSystem); if (fileSystem.m_BlockDatas.Capacity < fileSystem.m_HeaderData.BlockCount) { fileSystem.m_BlockDatas.Capacity = fileSystem.m_HeaderData.BlockCount; } for (int i = 0; i < fileSystem.m_HeaderData.BlockCount; i++) { stream.Read(s_CachedBytes, 0, BlockDataSize); BlockData blockData = Utility.Marshal.BytesToStructure <BlockData>(BlockDataSize, s_CachedBytes); fileSystem.m_BlockDatas.Add(blockData); } for (int i = 0; i < fileSystem.m_BlockDatas.Count; i++) { BlockData blockData = fileSystem.m_BlockDatas[i]; if (blockData.Using) { StringData stringData = fileSystem.ReadStringData(blockData.StringIndex); fileSystem.m_StringDatas.Add(blockData.StringIndex, stringData); fileSystem.m_FileDatas.Add(stringData.GetString(fileSystem.m_HeaderData.GetEncryptBytes()), i); } else { fileSystem.m_FreeBlockIndexes.Add(blockData.Length, i); } } int index = 0; foreach (KeyValuePair <int, StringData> i in fileSystem.m_StringDatas) { while (index < i.Key) { fileSystem.m_FreeStringIndexes.Enqueue(index++); } index++; } return(fileSystem); }
/// <summary> /// 加载文件系统。 /// </summary> /// <param name="fullPath">要加载的文件系统的完整路径。</param> /// <param name="access">要加载的文件系统的访问方式。</param> /// <param name="stream">要加载的文件系统的文件系统流。</param> /// <returns>加载的文件系统。</returns> public static FileSystem Load(string fullPath, FileSystemAccess access, FileSystemStream stream) { FileSystem fileSystem = new FileSystem(fullPath, access, stream); stream.Read(s_CachedBytes, 0, HeaderDataSize); fileSystem.m_HeaderData = Utility.Marshal.BytesToStructure <HeaderData>(HeaderDataSize, s_CachedBytes); if (!fileSystem.m_HeaderData.IsValid) { throw new GameFrameworkException(Utility.Text.Format("File system '{0}' is invalid.", fullPath)); } CalcOffsets(fileSystem); if (fileSystem.m_BlockDatas.Capacity < fileSystem.m_HeaderData.BlockCount) { fileSystem.m_BlockDatas.Capacity = fileSystem.m_HeaderData.BlockCount; } for (int i = 0; i < fileSystem.m_HeaderData.BlockCount; i++) { stream.Read(s_CachedBytes, 0, BlockDataSize); BlockData blockData = Utility.Marshal.BytesToStructure <BlockData>(BlockDataSize, s_CachedBytes); fileSystem.m_BlockDatas.Add(blockData); } for (int i = 0; i < fileSystem.m_BlockDatas.Count; i++) { BlockData blockData = fileSystem.m_BlockDatas[i]; if (blockData.Using) { StringData stringData = fileSystem.ReadStringData(blockData.StringIndex); fileSystem.m_StringDatas.Add(blockData.StringIndex, stringData); fileSystem.m_FileDatas.Add(stringData.GetString(fileSystem.m_HeaderData.GetEncryptBytes()), i); } else { fileSystem.m_FreeBlockIndexes.Add(blockData.Length, i); } } return(fileSystem); }