圧縮を行う必要のあるコードがあります。
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バイト)です。
私の最初の考えは、あなたが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);
}
}
私が持っている2つの方法は、JamesRolandが述べたようなものです。
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);
}