2014-02-08 149 views
-2

我想制作一个允许像.png文件一样压缩的文件类型,但是我在(de)压缩中找到的每个教程都包含整个流。我需要能够读取未压缩的头文件,然后在读取压缩标志后决定是否需要解压缩文件数据。有没有人知道一种方法来做到这一点?部分FileStream压缩/解压缩

+0

这不太清楚你的问题是什么。编写一个未压缩的头文件然后压缩数据是完全合理的。哪一点导致你的问题? –

+0

导致问题的部分正在从未压缩变为压缩。我知道如何将deflatestream连接到二进制打印机,但我不知道如何在解压缩模式下告诉deflatstream不要解压缩某些东西。 – stefanrbk

回答

3

你只需要编写一个未压缩的头文件,然后在 之后创建一个压缩流。这里有一个例子:

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"))); 
    }  
}