使用openWrite进行流式处理,直到关闭为止

时间:2011-07-21 15:55:06

标签: c# stream webclient filestream streamwriter

我有一个使用WebClient.OpenWrite调用打开的流编写器。对于这种简化的情况,假设读者正在读取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数据永远不会被发送。

如何在每次写电话后发送?我尝试添加writer.Flush()但这没有帮助。

感谢。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为你的问题是因为你的上一个块可能不是你期望的全长(dataChunkSize)。另外,我会添加Flush来强制每次写入然后如果需要(你不确定刷新是否有效)。尝试将循环内容更改为此...

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

答案 2 :(得分:0)

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

关于读者。它可以阅读更少。 所以最好使用

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

答案 3 :(得分:0)

如果要在关闭之前写入

,则需要调用stream.Flush()方法