-3

我正在尝试将下载的所有字节写入 3 个不同的文件,现在,我正在使用 WebRequest 和 WebResponse 对象。我确定这是正确的方法吗?我陷入了将数据部分写入文件的过程中。无论写入什么数据,现在的目标都是从同一流中读取数据并将其写入3个不同的文件。我可以成功写入第一个文件,而不是它给出错误 - 当我尝试将流(我从 response.getResponseStream() 获得)分配给另一个二进制读取器时,流不可读。

我试过两种方法——一种是直接将响应流传递给不同的二进制读取器,失败了。其次,我尝试为每个二进制阅读器创建单独的引用,但也失败了。如果有帮助,这里是代码: -

using (Stream strm = res.GetResponseStream())
{
    using (Stream strm1 = strm)
    {
        int i = 0;
        BinaryReader br = new BinaryReader(strm1);
        br.BaseStream.BeginRead(buffer, 0, buffer.Length, 
            new AsyncCallback(ProcessDnsInformation), br);
        Console.WriteLine("Data read {0} times", i++);
        Console.ReadKey();
        File.WriteAllBytes(@"C:\Users\Vishal Sheokand\Desktop\Vish.bin", buffer);
        br.Close();
    }

    using (Stream strm2=strm)
    {
        int i = 0;
        BinaryReader br = new BinaryReader(strm2);
        br.BaseStream.BeginRead(buffer, 0, buffer.Length, 
            new AsyncCallback(ProcessDnsInformation), br);
        Console.WriteLine("Data read {0} times", i++);
        Console.ReadKey();
        File.WriteAllBytes(@"C:\Users\Vishal Sheokand\Desktop\Vish1.bin", buffer);
        br.Close();
    }

    using (Stream strm3 = strm)
    {
        int i = 0;
        BinaryReader br = new BinaryReader(strm3);
        br.BaseStream.BeginRead(buffer, 0, buffer.Length, 
            new AsyncCallback(ProcessDnsInformation), br);
        Console.WriteLine("Data read {0} times", i++);
        File.WriteAllBytes(@"C:\Users\Vishal Sheokand\Desktop\Vish2.bin", buffer);
        br.Close();
    }
}

我正在学习 C#,请忽略一些(或全部)愚蠢的编码。

4

1 回答 1

5

你至少有两个问题。首先,看看这个:

using (Stream strm = res.GetResponseStream())
{
    using (Stream strm1 = strm)
    {
        ...
    }

一旦您退出内部块,该流将被释放 - 因此您无法在下一个块中读取它。

其次,您正在调用BeginReadwhich 将开始读取数据 - 但是您已经将回调的时间与您决定写入所有数据的时间完全分离。我强烈建议您首先使用同步 IO 进行所有这些工作,然后在适当的情况下使用异步 IO。

于 2012-10-10T16:28:53.737 回答