C# 带有openWrite的流在关闭之前不会写入

C# 带有openWrite的流在关闭之前不会写入,c#,stream,webclient,filestream,streamwriter,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;

我有一个使用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();
}
使用(streamwriter=myWebClient.OpenWrite(myURIString)
{
使用(FileStream reader=newfilestream(myFileName,FileMode.Open,FileAccess.Read)
{
for(int i=0;i
My data的大小为2个dataChunkSize。但是,在调用writer.Close()调用之前,它不会发送任何数据(没有收到任何数据),其中它只发送第一个dataChunkSize值的数据…第二个dataChunkSize值的数据永远不会发送

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


谢谢。

我猜写操作已缓冲。在缓冲区已满或写入程序已关闭之前,它不会写入。

我认为您的问题是,您的最后一个数据块可能不是您期望的完整长度(dataChunkSize)。此外,我会添加刷新以强制每次写入,然后在需要时(我不确定刷新是否有效)。请尝试将“for循环内容”更改为此

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

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

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

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

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

是否有办法减小缓冲区大小,使其成为dataChunkSize?请尝试使用.Flush()方法方法进行刷新。您也可以使用StreamWriter类并将AutoFlush属性设置为True。我尝试添加此代码…我的测试用例中的bytesRead等于dataChunkSize,而刷新无助于发送数据。@John,bytesRead在所有循环中都是相同的?如果您没有获得写入数据,则需要调试端点。找出正在接收的字节,并将它们与正在发送(或预期发送)的字节进行比较ByteRead是正在读取的字节的int计数器…所以我总是发送相同数量的字节,不一定是相同的数据…我想用dataChunkSize字节命中我的端点,但是缓冲区把事情搞砸了,并且没有发送每个写周期。如果读取流数据的最后一个块的长度不相同,那么读取的字节会更少s您的dataChunkSize。这用于确保您不会将任何不需要的后续数据写入写入写入流。即使它不能解决您的问题,您也肯定需要包含它。您是否有权访问写入数据的位置?如果有,请用几句话创建一个简单的文件,然后查看另一端的输出内容。哦,and您不需要使用“using”函数关闭和处置—它可以为您完成这项工作,可能与您的问题无关,但您使用流对象的方式使得显式调用close()和dispose()是多余的。当“using”函数block exits…嗨,John,下面的所有答案似乎都与缓冲区有关。您真正的问题仍然没有答案-如何让每个缓冲区独立发送?您找到答案了吗,因为调用Flush()没有任何作用。