我创建了一种方法,用于从压缩文件中返回所有未压缩字节。
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
一次) - 我已经使用过
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();
}
}