Декодировать поток LZMA C#

Я пытаюсь декодировать поток LZMA в объект потока, чтобы я мог читать с него, не перегружая память.

Мой входной файл выглядит так:

some uncompressed data
.
.
some lzma compressed data
.
.

И я хотел бы прочитать несжатые данные, а затем создать потоковый объект для чтения остальных сжатых данных.

Чтение всего этого в байт [] не вариант, потому что файл слишком большой. Мне нужен поток (который должен быть возможным, потому что вы можете архивировать очень большие файлы)

Я пытался использовать sevenzipsharp, но отсутствие документации делает невозможным для кого-то с моим (не очень значительным) опытом разобраться.

Какие-либо предложения?

Редактировать: я читаю из файла в память, поэтому недостаточно декодировать zip-файл в файл.

2 ответа

Вы можете использовать метод FileStream.Read для чтения несжатой части потока. После считывания всей несжатой части, этот способ продвигает позицию нижележащего потока к началу сжатой части, становясь эффективно потоком сжатой части, которая может использоваться для распаковки.

FileStream.Read заполняет байтовый массив несжатыми данными. Чтобы легко разобрать его содержимое, вы можете использовать BinaryReader следующим образом:

BinaryReader reader = BinaryReader(new MemoryStream(byteArray));
public static void Decompress(string inFile, string outFile) {
 try {
  inStream = new FileStream(inFile, FileMode.Open);
  outStream = new FileStream(outFile, FileMode.Create);

  byte[] properties = new byte[5];
  if (inStream.Read(properties, 0, 5) != 5)
   throw (new Exception("Input stream is too short."));

  Compression.LZMA.Decoder decoder = new Compression.LZMA.Decoder();
  decoder.SetDecoderProperties(properties);

  var br = new BinaryReader(inStream, Encoding.UTF8);
  long decompressedSize = br.ReadInt64();
  long compressedSize = br.ReadInt64();
  decoder.Code(inStream, outStream, compressedSize, decompressedSize, null);
 } catch (Exception e) {
  throw e;
 } finally {

  inStream.Flush();
  inStream.Close();
  outStream.Flush();
  outStream.Close();
 }
}
Другие вопросы по тегам