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); } }