0

次のように WebClient ストリームから読み取ると、バイトが失われるのはなぜですか?

const int chuckDim = 80;

System.Net.WebClient client = new System.Net.WebClient();
Stream stream = client.OpenRead("http://media-cdn.tripadvisor.com/media/photo-s/01/70/3e/a9/needed-backup-lol.jpg");
//Stream stream = client.OpenRead("file:///C:/Users/Tanganello/Downloads/needed-backup-lol.jpg");

//searching file length
WebHeaderCollection whc = client.ResponseHeaders;
int totalLength = (Int32.Parse(whc["Content-Length"]));
byte[] buffer = new byte[totalLength];

//reading and writing
FileStream filestream = new FileStream("C:\\Users\\Tanganello\\Downloads\\clone1.jpg", FileMode.Create, FileAccess.ReadWrite);
int accumulator = 0;
while (accumulator + chuckDim < totalLength) {
    stream.Read(buffer, accumulator, chuckDim);
    filestream.Write(buffer, accumulator, chuckDim);

    accumulator += chuckDim;
}
stream.Read(buffer, accumulator, totalLength - accumulator);
filestream.Write(buffer, accumulator, totalLength - accumulator);

stream.Close();
filestream.Flush();
filestream.Close();

これは私が最初のストリームで得たものです: http://img839.imageshack.us/img839/830/clone1h.jpg

4

1 に答える 1

4

問題は、 Stream.Readメソッドの戻り値を無視していることです。

カウント

現在のストリームから読み取られる最大バイト数。

戻り値

バッファに読み込まれた合計バイト数。これは、要求されたバイト数より少なくなる可能性があります


WebClient.DownloadFileメソッドを使用するだけで、ストリームの読み取りと書き込みのビジネス全体を回避できます。

using (var client = new WebClient())
{
    client.DownloadFile(
        "http://media-cdn.tripadvisor.com/media/photo-s/01/70/3e/a9/needed-backup-lol.jpg",
        "C:\\Users\\Tanganello\\Downloads\\clone1.jpg");
}

または、本当にストリームを使用したい場合は、Stream.CopyToメソッドを使用できます。

using (var client = new WebClient())
using (var stream = client.OpenRead("http://..."))
using (var file = File.OpenWrite("C:\\..."))
{
    stream.CopyTo(file);
}

自分で実際にバイトをコピーすることを主張する場合、これを行う正しい方法は次のようになります。

using (var client = new WebClient())
using (var stream = client.OpenRead("http://..."))
using (var file = File.OpenWrite("C:\\..."))
{
    var buffer = new byte[512];
    int bytesReceived;
    while ((bytesReceived = stream.Read(buffer, 0, buffer.Length)) != 0)
    {
        file.Write(buffer, 0, bytesReceived);
    }
}
于 2012-05-19T10:41:18.013 に答える