圧縮ファイルから圧縮されていないすべてのバイトを返すメソッドを作成しました。
public static byte[] GetAllBytesFromCompressedFile(string fullPath)
{
const int blockSize = 10000;
byte[] block = new byte[blockSize];
List<byte> allBytes = new List<byte>(blockSize);
int counter = 0;
using (FileStream file = new FileStream(fullPath, FileMode.Open))
{
using (DeflateStream compress = new DeflateStream(file, CompressionMode.Decompress))
{
int bytesRead = 0;
do
{
bytesRead = compress.Read(block, 0, blockSize);
counter += bytesRead;
allBytes.AddRange(block);
} while (bytesRead == blockSize);
}
}
return allBytes.GetRange(0, counter).ToArray();
}
正常に動作しますが、ループ内で数百万回呼び出される可能性があります。ほとんどのファイルはかなり小さいですが、最大で約 100Mb のものもあり、すべての小さなファイルに 100Mb を事前に割り当てたくありませんでした。だから私はいくつかの質問があります:
- まず、このようなメソッドはフレームワークに既にありますか? または、これを行うより良い方法はありますか?
- 圧縮ファイルの非圧縮サイズを取得する方法はありますか? (そうすれば、ループ内でブロックを取得する必要がなくなり、
Read
1回呼び出すことができます) - 使用
List<byte>
したので、手動でバイト配列を再割り当てする必要はありません。バイトを追加するより効率的な方法はありますか?
ほとんどの人にとって難しい問題ではないかもしれませんが、新しいコードをここに置きます。しかし、誰かがバッファサイズを明示的に設定するなど、改善できる何かを見つけるかもしれません(?)
public static byte[] GetAllBytesFromCompressedFile(string fullPath)
{
using (MemoryStream allBytes = new MemoryStream())
{
using (FileStream file = new FileStream(fullPath, FileMode.Open))
{
using (DeflateStream compress = new DeflateStream(file, CompressionMode.Decompress))
{
compress.CopyTo(allBytes);
}
}
return allBytes.ToArray();
}
}