GZipStream и декомпрессия
У меня есть код, который должен сделать сжатие:
FileStream fs = new FileStream("g:\\gj.txt", FileMode.Open);
FileStream fd = new FileStream("g:\\gj.zip", FileMode.Create);
GZipStream csStream = new GZipStream(fd, CompressionMode.Compress);
byte[] compressedBuffer = new byte[500];
int offset = 0;
int nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
while (nRead > 0)
{
csStream.Write(compressedBuffer, offset, nRead);
offset = offset + nRead;
nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length);
}
fd.Close();
fs.Close();
и я думаю, что это так, но я хочу распаковать то, что было сжато выше. Я делаю что-то подобное:
FileStream fd = new FileStream("g:\\gj.new", FileMode.Create);
FileStream fs = new FileStream("g:\\gj.zip", FileMode.Open);
GZipStream csStream = new GZipStream(fs, CompressionMode.Decompress);
byte[] decompressedBuffer = new byte[500];
int offset = 0;
int nRead;
nRead=csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length);
while (nRead > 0)
{
fd.Write(decompressedBuffer, offset, nRead);
offset = offset + nRead;
nRead = csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length);
}
fd.Close();
fs.Close();
и здесь это не... У меня есть nRead = 0, прежде чем войти в цикл... Что я делаю не так?? Тестовый файл, который я использую, является самым простым TEXT-файлом (размер: 104 байта)...
3 ответа
Моя первая мысль, что вы еще не закрылись csStream
, Если вы используете using
это происходит автоматически. Так как gzip буферизует данные, вы можете их пропустить.
Во-вторых, не увеличивайте offset
; это смещение в буфере (не в потоке). Оставьте в 0:
using (Stream fs = File.OpenRead("gj.txt"))
using (Stream fd = File.Create("gj.zip"))
using (Stream csStream = new GZipStream(fd, CompressionMode.Compress))
{
byte[] buffer = new byte[1024];
int nRead;
while ((nRead = fs.Read(buffer, 0, buffer.Length))> 0)
{
csStream.Write(buffer, 0, nRead);
}
}
using (Stream fd = File.Create("gj.new.txt"))
using (Stream fs = File.OpenRead("gj.zip"))
using (Stream csStream = new GZipStream(fs, CompressionMode.Decompress))
{
byte[] buffer = new byte[1024];
int nRead;
while ((nRead = csStream.Read(buffer, 0, buffer.Length)) > 0)
{
fd.Write(buffer, 0, nRead);
}
}
Два метода, которые у меня есть, такие же, как упоминал Джеймс Роланд.
private static byte[] Compress(HttpPostedFileBase file)
{
var to = new MemoryStream();
var from = new GZipStream(to, CompressionMode.Compress);
file.InputStream.CopyTo(from);
from.Close();
return to.ToArray();
}
private byte[] Decompress(byte [] img)
{
var to = new MemoryStream();
var from = new MemoryStream(img);
var compress = new GZipStream(from, CompressionMode.Decompress);
compress.CopyTo(to);
from.Close();
return to.ToArray();
}
Тем не менее, я использую загрузку с
Request.Files[0]
затем сожмите и сохраните в БД. Затем я вытаскиваю IMG, распаковываю и устанавливаю SRC с
$"data:image/gif;base64,{ToBase64String(Decompress(img))}";
Код ниже демонстрирует сжатие и распаковку с использованием GZipStream:
using System;
using System.IO;
using System.IO.Compression;
// ...
static void Main(string[] args)
{
string folder = @"c:\temp";
string dataPath = Path.Combine(folder, "data.dat");
string compressedPath = Path.Combine(folder, "compressed.gz");
string decompressedPath = Path.Combine(folder, "decompressed.dat");
using (FileStream fileReader = File.OpenRead(dataPath))
using (FileStream fileWriter = File.Create(compressedPath))
using (GZipStream compressionStream = new GZipStream(fileWriter, CompressionMode.Compress))
{
// Compresses and writes byte array contents to file
int readlength = 0;
byte[] buffer = new byte[1024];
do
{
readlength = fileReader.Read(buffer, 0, buffer.Length);
compressionStream.Write(buffer, 0, readlength);
} while (readlength > 0);
}
using (FileStream fileReader = File.OpenRead(compressedPath))
using (FileStream fileWriter = File.OpenWrite(decompressedPath))
using (GZipStream compressionStream = new GZipStream(fileReader, CompressionMode.Decompress))
{
// Decompresses and reads data from stream to file
int readlength = 0;
byte[] buffer = new byte[1024];
do
{
readlength = compressionStream.Read(buffer, 0, buffer.Length);
fileWriter.Write(buffer, 0, readlength);
} while (readlength > 0);
}
FileInfo dataFile = new FileInfo(dataPath);
FileInfo compressedFile = new FileInfo(compressedPath);
FileInfo decompressedFile = new FileInfo(decompressedPath);
Console.WriteLine($"Uncompressed file size: {dataFile.Length} bytes");
Console.WriteLine($"Compressed file size: {compressedFile.Length} bytes");
Console.WriteLine($"Decompressed file size: {decompressedFile.Length} bytes");
Console.Write("Press any key to quit . . . ");
Console.ReadKey(true);
}