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();
}
}
这是我的压缩/解压缩代码。我有一个任务是按块(块大小为1MB)将文件读入其他线程,并分别压缩和写入每个块。 并且有一个" System.IO.InvalidDataException被捕获 消息= GZip标头中的幻数不正确。确保你传递的是GZip流"在解压缩的同时。
出了什么问题?