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);
        }
Exemple #2
0
        /// <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);
            }
        }