private void UnpackMegFileFlatDirectoryHierarchy(MegFileHolder holder, string targetDirectory,
                                                         MegFileDataEntry megFileDataEntry)
        {
            string filePath = m_fileSystem.Path.Combine(targetDirectory, megFileDataEntry.RelativeFilePath);

            filePath = m_fileSystem.Path.Combine(targetDirectory, m_fileSystem.Path.GetFileName(filePath));
            using BinaryReader reader = GetBinaryReaderForFileHolder(holder);
            ExtractFileFromMegArchive(reader, megFileDataEntry, filePath);
        }
        private void UnpackMegFilePreservingDirectoryHierarchy(MegFileHolder holder, string targetDirectory,
                                                               MegFileDataEntry megFileDataEntry)
        {
            string filePath = m_fileSystem.Path.Combine(targetDirectory, megFileDataEntry.RelativeFilePath);
            string path     = m_fileSystem.FileInfo.FromFileName(filePath).Directory.FullName;

            CreateTargetDirectoryIfNotExists(path);
            using BinaryReader reader = GetBinaryReaderForFileHolder(holder);
            ExtractFileFromMegArchive(reader, megFileDataEntry, filePath);
        }
        private void ExtractFileFromMegArchive(BinaryReader readStream, MegFileDataEntry megFileDataEntry,
                                               string filePath)
        {
            byte[] buffer = new byte[BUFFER_SIZE];
            readStream.BaseStream.Seek(megFileDataEntry.Offset, SeekOrigin.Begin);
            using Stream writeStream =
                      m_fileSystem.FileStream.Create(filePath, FileMode.Append, FileAccess.Write, FileShare.None);
            int bytesRead;
            int bytesToWrite = Convert.ToInt32(megFileDataEntry.Size);

            while ((bytesRead = readStream.Read(buffer, 0, Math.Min(buffer.Length, bytesToWrite))) > 0)
            {
                bytesToWrite -= bytesRead;
                writeStream.Write(buffer, 0, bytesRead);
            }
        }