【问题标题】:Stream with openWrite not writing until it is closed使用 openWrite 的流在关闭之前不会写入
【发布时间】:2011-07-21 15:55:05
【问题描述】:

我有一个使用 WebClient.OpenWrite 调用打开的流编写器。对于这个简化的例子,假设 reader 正在读取 dataChunkSize 的倍数。

using (Stream writer = myWebClient.OpenWrite(myURIString)
{
    using (FileStream reader = new FileStream(myFileName, FileMode.Open, FileAccess.Read)
    {
        for(int i = 0; i < reader.Length; i += dataChunkSize)
        {
            byte[] data = new byte[dataChunkSize];
            reader.Read(data, 0, dataChunkSize);
            writer.Write(data, 0, dataChunkSize);
        }

        reader.Close();
        reader.Dispose();
    }

    writer.Close();
    writer.Dispose();
}

我的数据是 2 个 dataChunkSizes 的大小。但是,在调用 writer.Close() 之前,它不会发送任何数据(没有接收到数据),它只发送第一个 dataChunkSize 值的数据...永远不会发送第二个 dataChunkSize 数据。

如何在每次 Write 调用后发送它?我尝试添加 writer.Flush() 但这没有帮助。

谢谢。

【问题讨论】:

  • 可能与您的问题无关,但您使用流对象的方式使得调用 Close() 和 Dispose() 显式多余。当“使用”块退出时,它们会自动这样做......
  • 嗨,约翰,以下所有答案似乎都与缓冲区有关。您真正的问题仍未得到解答 - 如何让每个缓冲区独立发送?你找到答案了吗,因为调用 Flush() 没有任何作用。

标签: c# stream webclient filestream streamwriter


【解决方案1】:

我认为您的问题是因为您的最后一个块可能不是您期望的完整长度(dataChunkSize)。另外,我会添加 Flush 以强制每次写入,然后如果需要(我不确定刷新是否会起作用)。尝试将您的 for 循环内容更改为此...

byte[] data = new byte[dataChunkSize];
int bytesRead = reader.Read(data, 0, dataChunkSize);
writer.Write(data, 0, bytesRead);
writer.Flush();

【讨论】:

  • 我尝试添加此代码...我的测试用例中的bytesRead 等于dataChunkSize,并且刷新无助于发送数据。
  • @John,bytesRead 在所有循环中都相同吗?如果您没有获得写入数据,那么您需要调试您的端点。找出正在接收的字节并将它们与您正在发送(或期望发送)的内容进行比较
  • bytesRead 是正在读取的字节的 int 计数器......所以我总是发送相同数量的字节,不一定是相同的数据......我想用 dataChunkSize 字节命中我的端点,但是缓冲区搞砸了,没有发送每个写入周期
  • 不,如果您的读取流数据的最终块与您的 dataChunkSize 长度不同,则读取的字节数会更少。这用于确保您不会将任何尾随不需要的数据写入写入流。即使它不能解决您的问题,它也绝对是您需要包含的内容。您是否有权访问写入数据的位置?如果是这样,请用几句话制作一个简单的文件,然后查看另一端的输出。哦。并且您无需使用“使用”功能关闭和处置 - 它会为您完成此操作
【解决方案2】:

我猜写是缓冲的。在缓冲区已满或写入器关闭之前,它不会写入。

【讨论】:

  • 有没有办法减少缓冲区大小,使其成为dataChunkSize?
  • 尝试使用 .Flush() 方法进行刷新。您还可以使用 StreamWriter 类并将 AutoFlush 属性设置为 True。
【解决方案3】:

WebClient 可以使用内部缓冲流(网络等)。

关于读者。它可以读得更少。 所以更好用

    int amountRead = reader.Read(data, 0, dataChunkSize);
    writer.Write(data, 0, amountRead); 
    i += amountRead;

【讨论】:

    【解决方案4】:

    如果要在关闭前写入,则需要调用 stream.Flush() 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多