【问题标题】:Why am I getting inconsistent results with Read function on a Stream connected to network?为什么我在连接到网络的流上使用读取功能得到不一致的结果?
【发布时间】:2025-12-20 01:10:07
【问题描述】:

我正在使用一个简单的函数:-

while((br.Read(downbuffer, 0, downbuffer.Length)>0)
{
    //Write the data in downbuffer to a file.
}

虽然它适用于文件(在 zip 文件下载中多次测试-http://citylan.dl.sourceforge.net/project/cric-scoreslive/v8.5-Live%20Cricket%20Scores%20Desktop%20App.zip),但当链接指向 HTML 文件时它不起作用(在 http://www.mediafire.com/?rc3kj22p1tb4vi9 上测试)。使用后面的链接,它只下载和写入大约 1 KB 的数据,而页面约为 60 KB。 如果它与没有被刷新或任何事情有关,想知道它是如何处理文件下载的?相关代码是这样的:-(在单独的线程中运行)-

wreq = (HttpWebRequest)WebRequest.Create(uri);
wres = wreq.GetResponse();
fs = new FileStream(totalpath, FileMode.Create);
bw = new BinaryWriter(fs);
br = new BinaryReader(wres.GetResponseStream());
while((onecount=br.Read(downbuffer, 0, downbuffer.Length)>0)
{
    bw.Write(downbuffer, 0, onecount);
    totalcount += onecount;
}

totalpath 指向一个文件,没什么特别的。 downbuffer 大小为 20 KB,我的网速约为 60 kBps(512kbps)。

【问题讨论】:

  • 如果您只是将一个流复制到另一个流,为什么还要使用 BinaryWriter 和 Reader?
  • 我脑子里还有其他事情,我需要这样开始。现在有点难以解释,但我只知道现在要做。
  • BinaryReader:将原始数据类型读取为特定编码中的二进制值。那不是你想要的不是吗? Read 和 Write 方法在底层流上可用。用 BinaryReader/Writer 包装是没有意义的。如果您真的想继续这种废话,请在循环后尝试bw.Flush
  • 我也尝试过使用 bw.Flush(),HTML 页面也没有完全下载,第一个链接中的文件也没有在 while 循环中使用 bw.Flush (当然它存在于循环之外)。
  • 您只使用Write(byte[], int, int),该方法也可用于裸流。 BinaryWriter 没有任何作用。

标签: c# networking stream


【解决方案1】:

你可以通过避免它来解决整个问题:

using (var client = new WebClient())
{
    client.DownloadFile(uri, totalpath);
}

【讨论】:

  • 我只是想用 BinaryReader 来做,有没有办法?特别是我想挖掘一下为什么它在与其他文件一起工作时不能与 HTML 文件一起工作?它下载了我可以通过打开文件看到的一些数据,有时是 977 字节,有时是 987 字节等等。有什么想法吗?
最近更新 更多