我有一个大小的术语大文件,它给我错误“抛出类型'System.OutOfMemoryException'的异常。”
任何人都有解决此问题的想法或解决方案。请帮忙。 示例代码....
private string GetSha1()
{
string filePath = txtFileName.Text;
byte[] filebytes = System.IO.File.ReadAllBytes(filePath);
byte[] hashValue;
SHA1Managed hashString = new SHA1Managed();
string hex = "";
hashValue = hashString.ComputeHash(filebytes);
foreach (byte x in hashValue)
{
hex += String.Format("{0:x2}", x);
}
return hex;
}
我在以上代码的下面一行得到例外......
byte[] filebytes = System.IO.File.ReadAllBytes(filePath);
filePath的文件大小为> 500MB。
答案 0 :(得分:13)
而不是将整个文件读入内存只需将流传递给ComputeHash
using(var file = File.Open(path,FileMode.Open))
{
hashValue = hashString.ComputeHash(file);
}
答案 1 :(得分:2)
嗯,你已经解释了问题所在。您尝试将{500}文件直接读入byte[]
,因为您使用的是ReadAllBytes()
。这不适合除小文件以外的任何东西。
如果您想为文件计算哈希值,只需使用流作为参数:
using (filestream f = File.Open(path,FileMode.Open))
{
hashValue = hashString.ComputeHash(f);
}
答案 2 :(得分:1)
也许您应该使用System.IO.File.Read
并且一次只读取一个文件块到您的字节数组中,而不是一次读取整个文件。
使用Read
在MSDN上查看此示例。