protected override void DoOpen() { using (CustomBinaryReader reader = new CustomBinaryReader(new FileStream(ArchivePath, FileMode.Open, FileAccess.Read))) { uint signature = reader.ReadUInt32(); if (signature != 0x58445442) { throw new InvalidDataException("File is not BA2"); } version = reader.ReadUInt32(); if (version > 1) { throw new InvalidDataException("Unsupported archive file version: " + version); } type = (ArchiveType)reader.ReadUInt32(); if (type != ArchiveType.General) { Log.Fine("Skipping archive file which is not the general purpose type."); return; } long baseOffset = reader.BaseStream.Position; uint fileCount = reader.ReadUInt32(); long fileNameTableOffset = reader.ReadInt64(); FileInfo[] files = new FileInfo[fileCount]; for (int i = 0; i < fileCount; i++) { files[i] = new FileInfo() { NameHash = reader.ReadUInt32(), Type = reader.ReadUInt32(), DirectoryNameHash = reader.ReadUInt32(), Unknown1 = reader.ReadUInt32(), DataOffset = reader.ReadInt64(), DataCompressedSize = reader.ReadUInt32(), DataUncompressedSize = reader.ReadUInt32(), Unknown2 = reader.ReadUInt32() }; } reader.BaseStream.Position = fileNameTableOffset; for (int i = 0; i < fileCount; i++) { ushort length = reader.ReadUInt16(); string path = reader.ReadStringFixedLength(length).ToLower(); string dir = Path.GetDirectoryName(path).ToLower(); string filename = Path.GetFileName(path).ToLower(); if (!sorted.ContainsKey(dir)) { sorted.Add(dir, new SortedDictionary <string, FileInfo>()); } sorted[dir].Add(filename, files[i]); } } }