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 コンストラクター (ストリーム、CompressionMode、ブール値)

leaveOpen
タイプ:オブジェクトSystem.Boolean
trueを破棄した後、ストリームを開いたままにします。GZipStreamそれ以外の場合は、false.

また、Flush()は GZipStream では効果がありません

このメソッドの現在の実装は、内部バッファーをフラッシュしません。オブジェクトが破棄されると、内部バッファがフラッシュされます。

于 2013-06-04T08:39:21.050 に答える
0

ファイルは適切に圧縮されています。実際、ファイルには一連の圧縮ファイルが含まれていることがわかります。パーツ数分のアーカイブ数。新しい反復ごとに、新しいファイルが作成され、ファイルに追加されます。決断

梱包後、ファイルに書き込む前に、梱包の長さを指定する必要があります。

そのように:

圧縮:

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

解凍では、この長さを読み取り、解凍のためにファイルのこの長さと等しい部分を選択します。

于 2014-06-25T09:53:16.533 に答える
0

Yuoはそれが機能しgzip.Flush();ていないことを知る必要があります

MSDNから- GZipStream.Flush :

このメソッドの現在の実装は、内部バッファーをフラッシュしません。オブジェクトが破棄されると、内部バッファがフラッシュされます。

于 2013-06-04T08:40:19.543 に答える