2014-02-08 147 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"))); 
    }  
}