使用byte []读取大文件会出错

时间:2012-08-20 13:33:32

标签: c# asp.net

  

可能重复:
  Hash SHA1 large files (over 2gb) in C#

我有一个大小的术语大文件,它给我错误“抛出类型'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。

3 个答案:

答案 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并且一次只读取一个文件块到您的字节数组中,而不是一次读取整个文件。

使用ReadMSDN上查看此示例。