-2
我想製作一個允許像.png文件一樣壓縮的文件類型,但是我在(de)壓縮中找到的每個教程都包含整個流。我需要能夠讀取未壓縮的頭文件,然後在讀取壓縮標誌後決定是否需要解壓縮文件數據。有沒有人知道一種方法來做到這一點?部分FileStream壓縮/解壓縮
我想製作一個允許像.png文件一樣壓縮的文件類型,但是我在(de)壓縮中找到的每個教程都包含整個流。我需要能夠讀取未壓縮的頭文件,然後在讀取壓縮標誌後決定是否需要解壓縮文件數據。有沒有人知道一種方法來做到這一點?部分FileStream壓縮/解壓縮
你只需要編寫一個未壓縮的頭文件,然後在 之後創建一個壓縮流。這裏有一個例子:
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
class Program
{
private static void WriteCompressed(string file, byte[] data)
{
using (var fileStream = File.Create(file))
{
// Write a header saying it should be compressed. There's plenty
// more you could write here, of course. I've included 1 example.
BinaryWriter writer = new BinaryWriter(fileStream);
writer.Write(true); // Compressed
writer.Write(file); // Example of other data
using (var deflateStream = new DeflateStream(fileStream,
CompressionMode.Compress))
{
deflateStream.Write(data, 0, data.Length);
}
}
}
private static void WriteUncompressed(string file, byte[] data)
{
using (var fileStream = File.Create(file))
{
// Write a header saying it should be compressed. There's plenty
// more you could write here, of course.
BinaryWriter writer = new BinaryWriter(fileStream);
writer.Write(false); // Not compressed
writer.Write(file); // Example of other data
writer.Flush();
fileStream.Write(data, 0, data.Length);
}
}
private static byte[] ReadData(string file)
{
using (var fileStream = File.OpenRead(file))
{
BinaryReader reader = new BinaryReader(fileStream);
bool compressed = reader.ReadBoolean();
reader.ReadString(); // Original filename (ignore for now)
return ReadStreamFully(compressed
? new DeflateStream(fileStream, CompressionMode.Decompress)
: (Stream) fileStream);
}
}
private static byte[] ReadStreamFully(Stream stream)
{
var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
static void Main(string[] args)
{
WriteCompressed("foo.dat",
Encoding.UTF8.GetBytes("This data is compressed"));
WriteUncompressed("bardat",
Encoding.UTF8.GetBytes("This data is not compressed"));
Console.WriteLine(Encoding.UTF8.GetString(ReadData("foo.dat")));
Console.WriteLine(Encoding.UTF8.GetString(ReadData("bar.dat")));
}
}
這不太清楚你的問題是什麼。編寫一個未壓縮的頭文件然後壓縮數據是完全合理的。哪一點導致你的問題? –
導致問題的部分正在從未壓縮變爲壓縮。我知道如何將deflatestream連接到二進制打印機,但我不知道如何在解壓縮模式下告訴deflatstream不要解壓縮某些東西。 – stefanrbk