-3

ダウンロードしたすべてのバイトを 3 つの異なるファイルに書き込もうとしています。現在、WebRequest オブジェクトと WebResponse オブジェクトを使用しています。私はそれが正しい方法だと確信していますか?部分的にファイルにデータを書き込む部分で行き詰まりました。どのデータが書き込まれるかに関係なく、現在の目的は、同じストリームからデータを読み取り、3 つの異なるファイルに書き込むことです。エラーが発生するよりも、最初のファイルに正常に書き込むことができます-ストリーム(response.getResponseStream()から取得した)を別のバイナリリーダーに割り当てようとすると、ストリームが読み取れません。

私はそれを2つの方法で試しました.1つは、応答ストリームを異なるバイナリリーダーに直接渡すことです.失敗しました. 次に、バイナリリーダーごとに個別の参照を作成しようとしましたが、これも失敗しました。それが役立つ場合のコードは次のとおりです:-

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

少なくとも 2 つの問題があります。まず、これを見てください:

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

内側のブロックを出るとすぐに、ストリームは破棄されるため、次のブロックでストリームから読み取ることはできません。

第二に、データの読み取りを開始する呼び出しBeginReadを行っていますが、コールバックのタイミングを、すべてのデータの書き込みを決定した時点から完全に分離しています。最初に同期 IO でこれらすべてを機能させてから、必要に応じて非同期 IO に移行することを強くお勧めします。

于 2012-10-10T16:28:53.737 に答える