public void WriteToStream(Stream stream) { if (stream == BaseStream) { throw new InvalidOperationException("Cannot overwrite the same stream."); } using (var bw = new BinaryWriterEx(stream, true)) { bw.DefaultEndian = Endianness.BigEndian; var header = LIFFHeader.Default; bw.WriteStruct(header); long rootBlockPos = stream.Position; var rootBlock = new LIFFBlock { BlockHeader = 1, BlockType = 1, }; bw.WriteStruct(rootBlock); var contentBlock = new LIFFBlock { BlockHeader = 1, BlockType = 2, Spacing2 = 1, BlockSize = 26 }; bw.WriteStruct(contentBlock); bw.WriteInt16(1); bw.WriteInt32(0); WriteFolderBlocks(bw, RootFolder); long hierarchyBlockPos = stream.Position; var hierarchyBlock = new LIFFBlock { BlockHeader = 1, BlockType = 5, Spacing2 = 1 }; bw.WriteStruct(hierarchyBlock); WriteFolderEntries(bw, RootFolder); hierarchyBlock.BlockSize = (int)(stream.Position - hierarchyBlockPos); stream.Position = hierarchyBlockPos; bw.WriteStruct(hierarchyBlock); rootBlock.BlockSize = (int)(stream.Length - rootBlockPos); stream.Position = rootBlockPos; bw.WriteStruct(rootBlock); header.FileSize = (int)stream.Length; stream.Position = 0; bw.WriteStruct(header); } }
private void WriteFolderBlocks(BinaryWriterEx bw, FolderEntry folder) { var allChilds = folder.GetEntryHierarchy().ToList(); var totalFilesSize = allChilds.OfType <FileEntry>().Sum(x => x.FileSize); var folderBlock = new LIFFBlock { BlockHeader = 1, BlockType = 3, BlockSize = ((allChilds.Count() + 1) * LIFFBLOCK_SIZE) + (int)totalFilesSize }; bw.WriteStruct(folderBlock); foreach (var entry in folder.Entries.OrderBy(x => x.Name)) { if (entry is FileEntry file) { var fileBlock = new LIFFBlock { BlockHeader = 1, BlockType = 4, Spacing2 = 1, BlockSize = LIFFBLOCK_SIZE + (int)file.FileSize }; bw.WriteStruct(fileBlock); var fileStream = file.GetStream(); //fileStream.CopyTo(bw.BaseStream, 4096); byte[] buffer = new byte[4096]; int bytesRead = 0; while (bytesRead < file.FileSize) { int b = fileStream.Read(buffer, 0, buffer.Length); bytesRead += b; bw.Write(buffer, 0, b); if (b == 0) { break; } } } else { WriteFolderBlocks(bw, (FolderEntry)entry); } } }
public BlockHierarchy(LIFFBlock block, long positionInStream) { Block = block; PositionInStream = positionInStream; Childs = new List <BlockHierarchy>(); }