StreamReader ReadBlock挂起二进制文件

时间:2010-08-18 20:00:23

标签: c# mono streamreader readblock

我有一个小班,接受来自包含文件上传的浏览器的POST。我正在使用StreamReader来读取它。我读取了标题,然后当我到达正文时,我得到内容长度并创建一个大小的数组然后stream.ReadBlock()

char[] buffer = new char[contentLength];
stream.ReadBlock(buffer, 0, contentLength);
String body = new string(buffer);

当我运行此文件并POST一个文本文件时,它可以正常工作。但是,我已经尝试过ZIP文件和MP3文件,但这些都不起作用。它只是挂在stream.ReadBlock()电话上。

我首先在Ubuntu 10.04上使用Mono 2.6.7尝试了这个(我的MonoDevelop项目设置为使用.net 3.5)。我刚刚通过在VisualStudio 2010和.net 3.5中运行相同项目来验证Windows7上发生的情况。我试过从Firefox和Chrome发布。

任何人都知道为什么会发生这种情况?感谢。

我也尝试过使用BinaryReader而不是StreamReader:

byte[] bytes = reader.ReadBytes(contentLength);

但无论现在如何,它最终会挂在那个电话上。是因为我使用StreamReader来读取POST的标题然后使用BinaryReader来读取正文吗?

2 个答案:

答案 0 :(得分:4)

StreamReader用于 text 数据。您不应该在二进制数据上使用它 - 您应该使用BinaryReader或仅使用Stream

答案 1 :(得分:1)

使用StreamReader不适合二进制文件。它将执行各种文本编码工作,并且通常(可能)搞砸了。

一旦确定您正在使用的文件是二进制文件,就应该直接使用Stream对象来读取(部分)文件。这样,你就不必处理破坏内容的编码。