DOBON.NET DOBON.NETプログラミング掲示板過去ログ

POSTによるバイナリダウンロード

環境/言語:[C#]
分類:[.NET]

2004/12/25(Sat) 18:51:22 編集(投稿者)

http://dobon.net/vb/dotnet/internet/webrequestsavefile.html
http://dobon.net/vb/dotnet/internet/webrequestpost.html
現在上記のを参考にpostによりバイナリファイルをダウンロードするのをC#で作っているのですが,
いざファイルをHDD上に保存するときに,参考にあるように,

System.IO.Stream strm = webres.GetResponseStream();
//ファイルに書き込むためのFileStreamを作成
System.IO.FileStream fs =
    new System.IO.FileStream(fileName, 
        System.IO.FileMode.Create, 
        System.IO.FileAccess.Write);
//応答データをファイルに書き込む
int b;
while ((b = strm.ReadByte()) != -1)
    fs.WriteByte(Convert.ToByte(b));
//閉じる
fs.Close();
strm.Close();

のようにストリームからint型に読み込んで書き込んでます。
これだとあまりにダウンロード(書き込み)速度が遅かったので,
byte[] b = new byte[1024];
while ( (b = strm.Read(b, 0, b.Length)) > 0)
    fs.Write(b, 0, b.Length));
とやってみたところ,受信データが追いついていないのかファイルが壊れてます。

こういう場合,ファイルを壊さず速くダウンロードするにはどうするのが一番良いのでしょうか? 
> これだとあまりにダウンロード(書き込み)速度が遅かったので,
> byte[] b = new byte[1024];
> while ( (b = strm.Read(b, 0, b.Length)) > 0)
> fs.Write(b, 0, b.Length));
> とやってみたところ,受信データが追いついていないのかファイルが壊れてます。

私にはこのコードが動くということ自体奇跡としか言いようがないと思いますが。(本当にこのコードで動いたのでしょうか?)

「壊れる」というのが最後に余計なデータがつくということであれば、次のようにしてみてはいかがでしょうか?

byte[] b = new byte[1024];
int len;
while ((len = strm.Read(b, 0, b.Length)) > 0)
fs.Write(b, 0, len);
お返事ありがとうございます!
>byte[] b = new byte[1024];
>int len;
>while ((len = strm.Read(b, 0, b.Length)) > 0)
>fs.Write(b, 0, len);
としたところ壊れることなくファイル保存できました。

ところで
> 私にはこのコードが動くということ自体奇跡としか言いようがないと思いますが。(本当にこのコードで動いたのでしょうか?)
とのことですが,一応動いていたことは動いていたんですよ。(バッファの切れ目にゴミ付きですが…)
バイナリをネットワーク経由のストリームから読み込む正しいコードというのを教えてはいただけないでしょうか?
もしよろしければお願い致します。
>>私にはこのコードが動くということ自体奇跡としか言いようがないと思いますが。(本当にこのコードで動いたのでしょうか?)
> とのことですが,一応動いていたことは動いていたんですよ。(バッファの切れ目にゴミ付きですが…)

動かない(というかコンパイルエラーがでるであろう)と思ったのは、

b = strm.Read(b, 0, b.Length)

の部分です。Readはint型を返すので、バイト配列のbには代入できませんよね。
すみません…うつし間違ってました(汗
実際に書いていた(動いた)コードってのは下記のとおりでした

byte[] b = new byte[1024];
int x;
while ( (x = strm.Read(b, 0, b.Length)) > 0)
fs.Write(b, 0, b.Length));

バッファにReadの戻り値入れてもナンセンスですね、、って代入できないけど。

DOBON.NET | プログラミング道 | プログラミング掲示板