Распакуйте поток в строку, используя SevenZipSharp
Я хотел бы сжать строку с помощью SevenZipSharp и собрать воедино консольное приложение C# (я новичок в C#), используя следующий код (биты и кусочки которого возникли из аналогичных вопросов здесь, в SO).
Компрессия, кажется, работает (хотя я передаю файл вместо строки), вывод сжатой строки на консоль выглядит как бред, но я застрял на распаковке...
Я пытаюсь сделать то же самое, что и здесь (я думаю):
/questions/31608092/sevenzipsharp-szhatie-potoka-pamyati/31608101#31608101
/questions/32377651/kak-v-osnovnom-izvlech-fajl-s-pomoschyu-sevenzipsharp/32377668#32377668
/questions/20206750/7zipsharp-izvlechenie-raspakovka-potoka-v-potok/20206761#20206761
Примите во внимание любую помощь, в идеале консоль будет отображать сжатую строку, за которой следует распакованная строка.
Спасибо:)
using System;
using System.IO;
using SevenZip;
namespace _7ZipWrapper
{
public class Program
{
public static void Main()
{
SevenZipCompressor.SetLibraryPath(@"C:\Temp\7za64.dll");
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.CompressionMethod = CompressionMethod.Ppmd;
compressor.CompressionLevel = SevenZip.CompressionLevel.Ultra;
compressor.ScanOnlyWritable = true;
var compStream = new MemoryStream();
var decompStream = new MemoryStream();
compressor.CompressFiles(compStream, @"C:\Temp\a.txt");
StreamReader readerC = new StreamReader(compStream);
Console.WriteLine(readerC.ReadToEnd());
Console.ReadKey();
// works up to here... below here output to consol is: ""
SevenZipExtractor extractor = new SevenZip.SevenZipExtractor(compStream);
extractor.ExtractFile(0, decompStream);
StreamReader readerD = new StreamReader(decompStream);
Console.WriteLine(readerD.ReadToEnd());
Console.ReadKey();
}
}
}
1 ответ
Результатом сжатия являются двоичные данные - это не строка. Если вы попытаетесь прочитать это как строку, вы просто увидите мусор. Этого следовало ожидать - вы не должны воспринимать это как строку.
Следующая проблема в том, что вы пытаетесь читать с compStream
дважды, без "перемотки". Вы начинаете с конца потока, что означает, что нет данных для его распаковки. Если вы просто добавите:
compStream.Position = 0;
прежде чем создавать экстрактор, вы можете сразу же обнаружить, что он работает. Вам также может понадобиться перемотать decompStream
прежде чем читать из него. Таким образом, у вас будет такой код:
// Rewind to the start of the stream before decompressing
compStream.Position = 0;
SevenZipExtractor extractor = new SevenZip.SevenZipExtractor(compStream);
extractor.ExtractFile(0, decompStream);
// Rewind to the start of the decompressed stream before reading
decompStream.Position = 0;