Декодировать поток 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();
}
}