读取大文件 - System.OutOfMemoryException:抛出了类型'System.OutOfMemoryException'的异常。在C#中

时间:2014-01-10 07:10:33

标签: c#

当我上传此文件时,我的文件名就像“c3c81d9e-b390-4622-999c-eb74146afd10.dat”。 我不想改变上传逻辑。此文件大小为1 GB。

我的问题是,当不同的用户同时下载同一个文件时,它会抛出异常 - System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown

我的代码如下。(C#)

string path ="E:\Projects\testsite\Inetpub\wwwroot\Downloads";

byte[] FileContents;

FileContents = File.ReadAllBytes(path);

但是它给出了System.OutOfMemoryException:抛出了类型'System.OutOfMemoryException'的异常。

我在堆栈溢出时使用了以下解决方案。

Reading large file using byte[] gives error

byte[] hashValue;
SHA1Managed hashString = new SHA1Managed();                            
using (FileStream f = File.Open(path, FileMode.Open))
{
  hashValue = hashString.ComputeHash(f);
  foreach (byte x in hashValue)
  {
    file.HexadecimalValue += String.Format("{0:x2}", x);
  }
}

但是这个file.HexadecimalValue返回带有哈希值的字符串。 如何从file.HexadecimalValue提取数据并传递给HttpContext.Current.Response? 什么是最好的解决方案?

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您不想更改逻辑,则必须检查两个选项。

  1. 列表项您的应用程序应为64位
  2. 您正在使用.NetFramework 4.5(具有大对象支持)
  3. 这将使您的应用程序能够支持最大2 GB的超大对象。

    您可以通过更改配置文件来启用大对象支持,如下所示......

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
        <runtime>
          <gcAllowVeryLargeObjects enabled="true" /> 
        </runtime>
    </configuration>
    

    可能会解决您的问题。