同じ 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 番目のブロックは最初の方法とは異なります。私が逃したものは何ですか?