/// <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="name">要读取的文件名称。</param> /// <returns>存储读取文件内容的二进制流。</returns> public byte[] ReadFile(string name) { if (m_Access != FileSystemAccess.Read && m_Access != FileSystemAccess.ReadWrite) { throw new GameFrameworkException("File system is not readable."); } if (string.IsNullOrEmpty(name)) { throw new GameFrameworkException("Name is invalid."); } FileInfo fileInfo = GetFileInfo(name); if (!fileInfo.IsValid) { return(null); } int length = fileInfo.Length; byte[] buffer = new byte[length]; if (length > 0) { m_Stream.Position = fileInfo.Offset; m_Stream.Read(buffer, 0, length); } return(buffer); }
/// <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); }