c# - 使用 C# 从文件中读取前 10MB

标签 c# md5 filestream

我需要获取文件的前 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();

但它会读取整个文件。

最佳答案

您可以使用 TransformBlock 分块读取文件并将其分块提供给 MD5CryptoServiceProvider。 .这样,您就不必为缓冲区消耗 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")));

关于c# - 使用 C# 从文件中读取前 10MB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8019775/

相关文章:

sql-server - 由于数据存储仅支持本地路径,如何使用文件流管理大量数据?

C# 日期之间出现的月份和日期

ios - 获取 MD5 和 SHA-1

c# - 具有可为空日期时间的 linq

c# - AWS SQS,如何计算消息属性的 MD5 消息摘要

PHP MD5 与 MySQL md5

java - XMLStreamReader 问题

.net - 如何使用 FileStream 读取超过 2 GB 的大文件

c# - 优雅地处理损坏的状态异常

c# - 如何使用身份列表从 Entity Framework 获取 ObjectResult