Это следующий вопрос отсюда: Распаковать поток в строку с помощью SevenZipSharp .
Следующий код работает в том смысле, что он берет строку и успешно сжимает и распаковывает ее.
using System;
using System.IO;
using SevenZip;
namespace _7ZipWrapper
{
public class ProgramOriginal
{
public static void Main()
// This should be broken into separate methods
{
// Setup Input String
var strToCompress = "This String"; // will pass as parameter
var memStreamToCompress = new MemoryStream();
var StringToStream = new StreamWriter(memStreamToCompress);
StringToStream.Write(strToCompress);
StringToStream.Flush();
// Confirm the Input Stream is As-Expected
memStreamToCompress.Position = 0;
var MemoryAsString = new StreamReader(memStreamToCompress);
Console.WriteLine("Stream in memory: " + MemoryAsString.ReadToEnd());
Console.ReadKey();
// Setup the SevenZip Dll
SevenZipCompressor.SetLibraryPath(@"C:\Temp\7za64.dll");
// Set up a compressor...
SevenZipCompressor SevenZipC = new SevenZipCompressor();
SevenZipC.CompressionMethod = CompressionMethod.Ppmd;
SevenZipC.CompressionLevel = global::SevenZip.CompressionLevel.Ultra;
SevenZipC.ScanOnlyWritable = true;
// Compress PassedStream -> CompressedStream
var compressedMemoryStream = new MemoryStream();
SevenZipC.CompressStream(memStreamToCompress, compressedMemoryStream, "Optional Password Field");
compressedMemoryStream.Position = 0;
StreamReader compressedMemoryAsString = new StreamReader(compressedMemoryStream);
// Show that we have a compressed String
compressedMemoryStream.Position = 0;
Console.WriteLine(compressedMemoryAsString.ReadToEnd());
Console.ReadKey();
// Set up a decompressor... (only needs to know what to decompress)
compressedMemoryStream.Position = 0;
var SevenZipE = new SevenZip.SevenZipExtractor(compressedMemoryStream, "Optional Password Field");
// Decompress CompressedStream
var DecompressedMemoryStream = new MemoryStream();
SevenZipE.ExtractFile(0, DecompressedMemoryStream);
// Show that DecompressedMemoryStream is valid
DecompressedMemoryStream.Position = 0;
StreamReader decompressedStreamAsText = new StreamReader(DecompressedMemoryStream);
Console.WriteLine("Decompressed String: " + decompressedStreamAsText.ReadToEnd());
Console.ReadKey();
}
}
}
Однако приведенный выше код, очевидно, мало что дает в его нынешнем виде (ему суждено стать COM-библиотекой DLL).
Я думал, что я дома и в шланге, и что рефакторинг будет несложным. Однако мои попытки преобразовать код во что-то полезное оставили меня в недоумении относительно того, почему следующий код генерирует исключение System.ArgumentException («Поток недействительна или соответствующая подпись не найдена.'), но приведенный выше код работает без проблем.
В принципе должна быть какая-то разница, но я не понимаю, что ее вызывает и как решить. Решение, сопровождаемое кратким объяснением, будет высоко оценено.
using System;
using System.IO;
using SevenZip;
namespace _7ZipWrapper
{
public class Program
{
public static void Main()
{
// Setup Input String
var strToCompress = "This String"; // will eventually pass as parameter
// Convert input string to memory stream
var memStreamToCompress = StringToStream(strToCompress);
// Confirm the Input Stream is As-Expected
memStreamToCompress.Position = 0;
var MemoryAsString = new StreamReader(memStreamToCompress);
Console.WriteLine("Stream in memory: " + MemoryAsString.ReadToEnd());
Console.ReadKey();
// Compress the Stream
memStreamToCompress.Position = 0;
var compressedString = StreamCompress(memStreamToCompress, "password");
// Decompress the String
var memStreamToRestore = StringToStream(compressedString);
memStreamToRestore.Position = 0;
var decompressedString = StreamDecompress(memStreamToRestore, "password");
Console.WriteLine(decompressedString);
Console.ReadKey();
}
private static MemoryStream StringToStream(string strToMemoryStream)
{
var memoryStream = new MemoryStream();
var writer = new StreamWriter(memoryStream);
writer.Write(strToMemoryStream);
writer.Flush();
return memoryStream;
}
private static MemoryStream StringToStream1(string strToMemoryStream)
{
var memoryStream = new MemoryStream();
var writer = new StreamWriter(memoryStream);
writer.Write(strToMemoryStream);
writer.Flush();
return memoryStream;
}
private static string StreamCompress(MemoryStream memStreamToCompress, string optionalPassword)
{
// Setup the SevenZip Dll
SevenZipCompressor.SetLibraryPath(@"C:\Temp\7za64.dll");
// Set up a compressor...
SevenZipCompressor SevenZip = new SevenZipCompressor();
SevenZip.CompressionMethod = CompressionMethod.Ppmd;
SevenZip.CompressionLevel = global::SevenZip.CompressionLevel.Ultra;
SevenZip.ScanOnlyWritable = true;
// Compress PassedStream -> CompressedStream
var compressedMemoryStream = new MemoryStream();
SevenZip.CompressStream(memStreamToCompress, compressedMemoryStream, optionalPassword); // "Optional Password Field"
compressedMemoryStream.Position = 0;
StreamReader compressedMemoryAsString = new StreamReader(compressedMemoryStream);
return compressedMemoryAsString.ReadToEnd();
}
private static string StreamDecompress(MemoryStream compressedMemoryStream, string optionalPassword)
{
// Setup the SevenZip Dll
SevenZipExtractor.SetLibraryPath(@"C:\Temp\7za64.dll");
// Set up a decompressor... (only needs to know what to decompress)
compressedMemoryStream.Position = 0;
// CRASHES Next Line: System.ArgumentException: 'The stream is invalid or no corresponding signature was found.'
var SevenZip = new SevenZip.SevenZipExtractor(compressedMemoryStream, optionalPassword);
// Decompress CompressedStream
var DecompressedMemoryStream = new MemoryStream();
SevenZip.ExtractFile(0, DecompressedMemoryStream);
// Show that DecompressedMemoryStream is valid
DecompressedMemoryStream.Position = 0;
StreamReader decompressedStreamAsText = new StreamReader(DecompressedMemoryStream);
return decompressedStreamAsText.ReadToEnd();
}
}
}
Примечание. Хотя я понимаю, что с этим кодом, который я изучаю, может быть несколько проблем, я намерен опубликовать следующую итерацию на CodeReview. Тем не менее, не стесняйтесь предлагать предложения, но сейчас это учебное упражнение для меня. ТИА