HttpResponse.WriteFile方法参数bool readIntoMemory做什么?

时间:2010-08-16 21:58:54

标签: c# asp.net vb.net httpresponse

HttpResponse.WriteFile方法参数bool readIntoMemory做什么?

MSDN documentation在这方面非常无益,因为我遇到了这种方法,并不完全确定我为什么要这样做或不这样做。

注意:任何人都应该回复“它将文件读入内存”,没有进一步的解释将会被低估。

3 个答案:

答案 0 :(得分:6)

Russ对行为是正确的 - 你使用它的原因是为了避免文件打开/锁定 - 特别是因为客户端可能很慢,或者超时,可能更可取的是使内存权衡和缓冲将文件存入内存,因此这个bool允许您自己跳过ReadAllBytes缓冲区,然后编写生成的缓冲区。

答案 1 :(得分:4)

不同之处在于读取文件内容的时间。

如果您为true传递readIntoMemory,则会打开文件流,读入内存并关闭,所有这些都会在WriteFile期间发生。另一方面,如果传递false,文件流将被打开并再次关闭而不会读取(只是为了验证文件是否存在)。相反,有关要写入的文件的信息将传递到某个内部缓冲区(使用内部HttpWriter.WriteFile方法)。稍后(可能在刷新响应时,但我还没有验证),将读取文件的内容。

请考虑以下代码:

protected void Page_Load(object sender, EventArgs e)
{
    Response.WriteFile(@"C:\myFile", false);
    System.IO.File.Move(@"C:\myFile", "C:\myFile2");
    Response.End();
}

请注意,您的浏览器不会收到回复,即在Response.End期间出现非常糟糕的情况。将readIntoMemory设置为true可以避免此问题。

答案 2 :(得分:2)

使用Reflector查看,它似乎表明在写入响应之前文件是否应该在内存中缓冲。

使用FileStream打开文件,然后如果设置了布尔标志,它首先将文件读入字节数组,然后使用WriteBytes将该数组写入响应。

如果未设置标志,则使用WriteFile将文件写入响应。

前两种情况都假设正在使用HttpWriter。如果不是这种情况,则使用WriteStreamAsText