C# 部分文件流压缩/解压缩

C# 部分文件流压缩/解压缩,c#,compression,filestream,C#,Compression,Filestream,我正在尝试创建一种文件类型,它允许像.png文件那样进行压缩,但是我在(反)压缩方面找到的每一个教程都包括整个流。我需要能够读取未压缩的头,然后在读取压缩标志后决定是否需要解压缩文件数据。有人知道这样做的方法吗?您只需要编写一个未压缩的头,然后在之后创建一个压缩流 那个下面是一个例子: using System; using System.IO; using System.IO.Compression; using System.Text; class Program { privat

我正在尝试创建一种文件类型,它允许像.png文件那样进行压缩,但是我在(反)压缩方面找到的每一个教程都包括整个流。我需要能够读取未压缩的头,然后在读取压缩标志后决定是否需要解压缩文件数据。有人知道这样做的方法吗?

您只需要编写一个未压缩的头,然后在之后创建一个压缩流 那个下面是一个例子:

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不要解压缩某些内容。