public void CompressFile(string fileName, string outFile)
{
var sync = new object();
using (var inStream =
new FileStream(fileName, FileMode.Open, FileAccess.Read))
using (var bReader = new BinaryReader(inStream))
using (var outStream =
new FileStream(outFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
var uncompressedBytes = new byte[1000000];
while (bReader.Read(uncompressedBytes, 0, uncompressedBytes.Length) > 0)
{
var thr = new Thread(
() =>
{
lock (sync)
{
CompressedBytes = CompressGzip(uncompressedBytes);
ThreadsCount++;
}
});
thr.Start();
thr.Join();
outStream.Write(CompressedBytes, 0, CompressedBytes.Length);
}
BeforeCompressionBytes = inStream.Length;
AfterCompressionBytes = outStream.Length;
inStream.Close();
outStream.Close();
}
}
public void DecompressFile(string fileName, string outFile)
{
var sync = new object();
using (var inStream =
new FileStream(fileName, FileMode.Open, FileAccess.Read))
using (var bReader = new BinaryReader(inStream))
using (var outStream =
new FileStream(outFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
var uncompressedBytes = new byte[1000000];
while (bReader.Read(uncompressedBytes, 0, uncompressedBytes.Length) > 0)
{
var thr = new Thread(
() =>
{
lock (sync)
{
CompressedBytes = DecompressGzip(uncompressedBytes);
ThreadsCount++;
}
});
thr.Start();
thr.Join();
outStream.Write(CompressedBytes, 0, CompressedBytes.Length);
}
BeforeCompressionBytes = inStream.Length;
AfterCompressionBytes = outStream.Length;
inStream.Close();
outStream.Close();
}
}
public byte[] CompressGzip(byte[] uncompressedBytes)
{
using (var memory = new MemoryStream())
{
using
(var gZipStream =
new GZipStream(memory, CompressionMode.Compress, true))
{
gZipStream.Write
(uncompressedBytes, 0, uncompressedBytes.Length);
}
return memory.ToArray();
}
}
public byte[] DecompressGzip(byte[] compressedBytes)
{
var decompressed = new byte[compressedBytes.Length];
using (var memory = new MemoryStream(compressedBytes))
{
using
(var gZipStream =
new GZipStream(memory, CompressionMode.Decompress, true))
{
gZipStream.Read
(decompressed, 0, compressedBytes.Length);
}
return memory.ToArray();
}
}
Вот мой код сжатия / распаковки. У меня есть задача читать файлы блоками (размером блока 1 МБ) в другие потоки и сжимать и записывать каждый блок отдельно. И есть исключение System.IO.InvalidDataException. Сообщение = Магический номер в заголовке GZip неверен. Убедитесь, что вы передаете "поток GZip" во время распаковки.
Что не так?
Почему вы читаете большой кусок байтов, затем создаете поток, заставляете поток сжать байты, ожидаете завершения потока и затем записываете байты? Зачем возиться с нитью?





не ответ, но в
DecompressGzip: 1. обратите внимание, что массивdecompressed, очевидно, должен быть намного больше, чемcompressedBytes.Length, и 2. вы возвращаетеmemory.ToArray(), где вы, вероятно, имели в видуdecompressed.