2

同じ GZipStream を使用してループ内のファイル ブロックを圧縮すると、結果ファイルは正常に圧縮されます。

public static void Compress1(string fi)
        {
            using (FileStream inFile = File.Open(fi,FileMode.Open,FileAccess.Read,FileShare.Read))
            {

                using (FileStream outFile = File.Create(fi + ".gz"))
                {
                    using (GZipStream Compress = new GZipStream(outFile,
                            CompressionMode.Compress))
                    {
                        byte[] buffer = new byte[6315120];
                        int numRead;
                        while ((numRead = inFile.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            Compress.Write(buffer, 0, numRead);
                        }
                    }
                }
            }
        }

しかし、ファイル ブロックを異なるストリームで個別に圧縮すると、結果ファイルが破損します。

public static void Compress2(string fi, int offset)
    {
        using (FileStream inFile = File.Open(fi,FileMode.Open))
        { 
            using (FileStream outFile = File.OpenOrCreate(fi + ".gz"))
                {
                    using (GZipStream Compress = new GZipStream(outFile,
                            CompressionMode.Compress))
                    {
                        // Copy the source file into the compression stream.
                        byte[] buffer = new byte[6315120];
                        int numRead=-1;
                        inFile.Seek(offset,SeekOrigin.Begin);
                        numRead = inFile.Read(buffer, 0, buffer.Length);
                        Compress.Write(buffer, 0, numRead);
                    }
                }
        }
    }

これらの例では、サイズ = 12630240 のファイルがあります。それを 2 つのブロックに分割し、各ブロックのサイズ = 6315120 (バッファ サイズ) にします。したがって、最初のブロックは両方の方法で正しく圧縮されますが、2 番目の方法の 2 番目のブロックは最初の方法とは異なります。私が逃したものは何ですか?

4

1 に答える 1

2

何が起こっているのかというと、各 GZipStream には 1 つのヘッダーがあり、作成していることを別の GZ ファイルに分割するため、別のファイルに作成しています。2 つを同じファイルに書き込むと、破損したファイルになります。

于 2013-07-19T08:26:31.107 に答える