【发布时间】:2014-05-21 13:56:42
【问题描述】:
我创建了一种方法,用于从压缩文件中返回所有未压缩字节。
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();
}
}
【问题讨论】:
标签: c# deflatestream