我需要获取文件的前10mb并从中计算md5,我该如何实现?我找不到任何文件读取样本.我有这样的事情:
FileStream file = new FileStream(fileName, FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
var md5Final = sb.ToString();
Run Code Online (Sandbox Code Playgroud)
但它读取整个文件.
您可以使用块以块的形式读取文件并将其以块的形式提供给MD5CryptoServiceProvider TransformBlock.这样,您不必为缓冲区消耗10 MB的内存.例:
long read = 0;
int r = -1;
const long bytesToRead = 10 * 1024 * 1024;
const int bufferSize = 10*1024;
byte[] buffer = new byte[bufferSize];
MD5 md5 = new MD5CryptoServiceProvider();
using(var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read) )
{
while(read <= bytesToRead && r != 0)
{
read += (r = stream.Read(buffer, 0, bufferSize));
md5.TransformBlock(buffer, 0, r, null, 0);
}
}
md5.TransformFinalBlock(buffer, 0,0);
string md5Final = String.Join("", md5.Hash.Select(x => x.ToString("x2")));
Run Code Online (Sandbox Code Playgroud)