public IList <IArchiveFileInfo> Load(Stream input) { using var br = new BinaryReaderX(input, true); // Read header _header = br.ReadType <X3Header>(); // Read file entries var entries = br.ReadMultiple <X3FileEntry>(_header.fileCount); // Add files var result = new List <IArchiveFileInfo>(); foreach (var entry in entries) { var rawFileStream = new SubStream(input, entry.offset * _header.alignment, entry.fileSize); // Prepare (de-)compressed file stream for extension detection Stream fileStream = rawFileStream; if (entry.IsCompressed) { fileStream = new X3CompressedStream(fileStream); } var extension = X3Support.DetermineExtension(fileStream); var fileName = $"{result.Count:00000000}{extension}"; // Pass unmodified SubStream, so X3Afi can take care of compression wrapping again // Necessary for access to original compressed file data in saving result.Add(new X3ArchiveFileInfo(rawFileStream, fileName, entry)); } return(result); }
public Stream GetFinalStream() { if (!ContentChanged) { _rawStream.Position = 0; return(_rawStream); } var result = FileData; if (ShouldCompress && ContentChanged) { return(X3CompressedStream.Compress(FileData)); } result.Position = 0; return(result); }