private List <File8> ReadFileList() { var containerHeader = FileFormat.ContainerHeader.Read(_reader); _storageVersion = (int)containerHeader.StorageVer; var elemsAddrsBuf = BlockReaderStream.ReadDataBlock(_reader); var addresses = FileFormat.ElementAddress.Parse(elemsAddrsBuf); var fileList = new List <File8>(); foreach (var address in addresses) { if (address.HeaderAddress == FileFormat.V8_FF_SIGNATURE || address.Signature != FileFormat.V8_FF_SIGNATURE) { continue; } _reader.Seek(address.HeaderAddress, SeekOrigin.Begin); var buf = BlockReaderStream.ReadDataBlock(_reader); var fileHeader = FileFormat.ElementHeader.Parse(buf); fileList.Add(new File8(fileHeader, address.DataAddress)); } return(fileList); }
/// <summary> /// Считывает текущий блок данных из восьмофайла. /// </summary> /// <returns>Считанные данные.</returns> /// <param name="reader">Входящий поток.</param> public static byte[] ReadDataBlock(Stream reader) { var blockReader = new BlockReaderStream(reader); var buf = new byte[blockReader.Length]; blockReader.Read(buf, 0, buf.Length); return(buf); }
public void Extract(File8 element, string destDir, bool recursiveUnpack = false) { if (!Directory.Exists(destDir)) { Directory.CreateDirectory(destDir); } _reader.Seek(element.DataOffset, SeekOrigin.Begin); Stream fileExtractor; var blockExtractor = new BlockReaderStream(_reader); if (blockExtractor.IsPacked && _dataPacked) { fileExtractor = new DeflateStream(blockExtractor, CompressionMode.Decompress); } else { fileExtractor = blockExtractor; } if (blockExtractor.IsContainer && recursiveUnpack) { string outputDirectory = Path.Combine(destDir, element.Name); var tmpData = new MemoryStream(); // TODO: переделать MemoryStream --> FileStream fileExtractor.CopyTo(tmpData); tmpData.Seek(0, SeekOrigin.Begin); var internalContainer = new File8Reader(tmpData, dataPacked: false); internalContainer.ExtractAll(outputDirectory, recursiveUnpack); return; } // Просто файл string outputFileName = Path.Combine(destDir, element.Name); using (var outputFile = new FileStream(outputFileName, FileMode.Create)) { fileExtractor.CopyTo(outputFile); } }