0

我尝试使用此代码部分压缩文件

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

但是我解压后文件损坏了。此代码有效

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];

        while (true)
        {
            var readCount = fsIn.Read(buf, 0, buf.Length);
            if (readCount <= 0)
            {
                break;
            }

            // This string was transferred into "while" cycle
            using (var gzip = new GZipStream(fsOut, CompressionMode.Compress, true))
            {
                gzip.Write(buf, 0, buf.Length);
            }
        }
    }
}

为什么 gzip.Flush() 不起作用?为什么只有 gzip.Close() 有效?

4

3 回答 3

1

new GZipStream(fsOut, CompressionMode.Compress, true)处理后保持流打开,您应该将最后一个参数更改为false.

GZipStream 构造函数(流、压缩模式、布尔值)

leaveOpen
类型:在处理对象System.Boolean
true后保持流打开;GZipStream否则,false

Flush()在 GZipStream 中也没有效果

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

于 2013-06-04T08:39:21.050 回答
0

你需要知道那gzip.Flush();是行不通的

来自MSDN - GZipStream.Flush

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

于 2013-06-04T08:40:19.543 回答
0

文件被正确压缩。事实上,该文件包含一组压缩文件。档案数量等于零件的数量。在每次新的迭代中,一个新文件并附加到文件中。决定

需要指定打包后刻录到文件前的打包长度。

就像这样:

压缩:

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

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

于 2014-06-25T09:53:16.533 回答