C# 如果我将文件打包成部分,GZipStream会损坏文件(Flush不工作)

C# 如果我将文件打包成部分,GZipStream会损坏文件(Flush不工作),c#,flush,gzipstream,C#,Flush,Gzipstream,我试着用这段代码将一个文件压缩成部分 using (var fsIn = new FileStream("test.avi", FileMode.Open)) { using (var fsOut = new FileStream("test.avi.gz", FileMode.Create)) { var buf = new byte[1024 * 1024]; using (var gzip = new GZipStream(fsOut, C

我试着用这段代码将一个文件压缩成部分

using (var fsIn = new FileStream("test.avi", FileMode.Open))
{
    using (var fsOut = new FileStream("test.avi.gz", FileMode.Create))
    {
        var buf = new byte[1024 * 1024];

        using (var gzip = new GZipStream(fsOut, CompressionMode.Compress, true))
        {
            while (true)
            {
                var readCount = fsIn.Read(buf, 0, buf.Length);
                if (readCount <= 0)
                {
                    break;
                }

                gzip.Write(buf, 0, buf.Length);
                gzip.Flush();
            }
        }
    }
}
使用(var fsIn=newfilestream(“test.avi”,FileMode.Open))
{
使用(var fsOut=newfilestream(“test.avi.gz”,FileMode.Create))
{
var buf=新字节[1024*1024];
使用(var gzip=new GZipStream(fsOut,CompressionMode.Compress,true))
{
while(true)
{
var readCount=fsIn.Read(buf,0,buf.Length);
如果(readCount
new GZipStream(fsOut,CompressionMode.Compress,true)
在处理后使流保持打开状态,则应将最后一个参数更改为
false

leaveOpen

类型:
System.Boolean

true
在处理
GZipStream
对象后保持流打开;否则,
false

在GZipStream中也没有效果

此方法的当前实现不刷新内部 当对象被释放时,内部缓冲区被刷新


你需要知道
gzip.Flush();
不起作用

发件人:

此方法的当前实现不刷新内部 当对象被释放时,内部缓冲区被刷新


文件已正确压缩。事实上,该文件包含一组压缩文件。存档编号等于部分编号。在每次新迭代中,都会添加一个新文件并附加到该文件中。 决断

您需要在打包之后和刻录到文件之前指定打包的长度

就这样,

压缩:

BitConverter.GetBytes(compressedPart.Length).CopyTo(blockToWrite, 4);

在解压中读取此长度并选择文件的一部分等于此长度进行解压。

如果我写“false”,那么它将不起作用,因为我需要在第二个版本中保留打开的fsOut。默认值为false.Hm。内置的方法摘要告诉我们相反的情况。
BitConverter.GetBytes(compressedPart.Length).CopyTo(blockToWrite, 4);