Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
        }