private MegFileContentTable BuildFileContentTables(MegFileAttribute megFileAttribute, MegFileNameTable megFileNameTable) { List <string> absoluteFilePaths = megFileAttribute.ContentFiles.ToList(); List <MegFileContentTableRecord> megFileContentList = new List <MegFileContentTableRecord>(); uint currentOffset = new MegHeader(0, 0).Size(); currentOffset += megFileNameTable.Size(); for (int i = 0; i < megFileNameTable.MegFileNameTableRecords.Count; i++) { uint crc32 = ChecksumUtility.GetChecksum(megFileNameTable.MegFileNameTableRecords[i].FileName); uint fileSizeInBytes = Convert.ToUInt32(new FileInfo(absoluteFilePaths[i]).Length); uint fileNameTableIndex = Convert.ToUInt32(i); MegFileContentTableRecord megFileContentTableRecord = new MegFileContentTableRecord(crc32, 0, fileSizeInBytes, 0, fileNameTableIndex); megFileContentList.Add(megFileContentTableRecord); currentOffset += megFileContentTableRecord.Size(); } megFileContentList.Sort(); for (int i = 0; i < megFileContentList.Count; i++) { megFileContentList[i].FileTableRecordIndex = Convert.ToUInt32(i); megFileContentList[i].FileStartOffsetInBytes = currentOffset; currentOffset += megFileContentList[i].FileSizeInBytes; } return(new MegFileContentTable(megFileContentList)); }
private static void UnpackFile(string targetDirectory, MegFileContentTableRecord megFileContentTableRecord, MegFile megFile, BinaryReader reader) { byte[] file = new byte[megFileContentTableRecord.FileSizeInBytes]; string fileName = megFile.FileNameTable.MegFileNameTableRecords[Convert.ToInt32(megFileContentTableRecord.FileNameTableRecordIndex)].FileName; reader.BaseStream.Seek(Convert.ToInt32(megFileContentTableRecord.FileStartOffsetInBytes), SeekOrigin.Begin); reader.Read(file, 0, file.Length); string path = Path.Combine(targetDirectory, fileName); PathUtility.CreatePath(Path.GetDirectoryName(path)); using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create))) { writer.Write(file); } }
internal static uint GetMegFileHeaderSize(string megFilePath) { uint headerSize = 0; using (BinaryReader reader = new BinaryReader(new FileStream(megFilePath, FileMode.Open))) { uint containedFiles = reader.ReadUInt32(); uint currentOffset = sizeof(uint) * 2; for (uint i = 0; i < containedFiles; i++) { reader.BaseStream.Seek(currentOffset, SeekOrigin.Begin); ushort fileNameLenght = reader.ReadUInt16(); currentOffset += Convert.ToUInt32(sizeof(ushort) + fileNameLenght); } headerSize += currentOffset; uint megContentTableRecordSize = new MegFileContentTableRecord(0, 0, 0, 0, 0).Size(); headerSize += megContentTableRecordSize * containedFiles; } return(headerSize); }