DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DOBON.NET

WebRequest、WebResponseクラスを使ってファイルをダウンロードし保存する

WebRequest、WebResponseクラスを使ってファイルをダウンロードし表示する」とほとんど変わりません。FileStreamクラスを使用して読み込んだデータを書き込むだけです。FileStreamについては、こちらをご覧ください。

次の例では、「http://localhost/logo.gif」をダウンロードし、ファイルに保存しています。

[VB.NET]
'ダウンロードするファイル
Dim url As String = "http://localhost/logo.gif"
'保存先のファイル名
Dim fileName as String = "c:\logo.gif"

'WebRequestの作成
Dim webreq As System.Net.HttpWebRequest = _
    CType(System.Net.WebRequest.Create(url), _
        System.Net.HttpWebRequest)

'サーバーからの応答を受信するためのWebResponseを取得
Dim webres As System.Net.HttpWebResponse = _
    CType(webreq.GetResponse(), System.Net.HttpWebResponse)

'応答データを受信するためのStreamを取得
Dim strm As System.IO.Stream = webres.GetResponseStream()

'ファイルに書き込むためのFileStreamを作成
Dim fs As New System.IO.FileStream(fileName, _
    System.IO.FileMode.Create, System.IO.FileAccess.Write)

'応答データをファイルに書き込む
Dim b As Integer
While True
    b = strm.ReadByte()
    If b = -1 Then Exit While
    fs.WriteByte(Convert.ToByte(b))
End While

'閉じる
fs.Close()
strm.Close()
[C#]
//ダウンロードするファイル
string url = "http://localhost/logo.gif";
//保存先のファイル名
string fileName = "c:\\logo.gif";

//WebRequestの作成
System.Net.HttpWebRequest webreq =
    (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);

//サーバーからの応答を受信するためのWebResponseを取得
System.Net.HttpWebResponse webres =
    (System.Net.HttpWebResponse) webreq.GetResponse();

//応答データを受信するためのStreamを取得
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();

上記のサンプルではReadByteメソッドで読み込み、WriteByteメソッドで書き込んでいるため、処理速度は遅いです。パフォーマンスを高めるためには、これらのメソッドの代わりにRead、Writeメソッドの使用や、非同期処理を検討してください。

Read、Writeメソッドを使用した例を以下に示します。

[VB.NET]
'省略

'応答データをファイルに書き込む
Dim readData(1023) As Byte
Dim readSize As Integer = 0
While True
    readSize = strm.Read(readData, 0, readData.Length)
    If readSize = 0 Then
        Exit While
    End If
    fs.Write(readData, 0, readSize)
End While

'省略
[C#]
//省略

//応答データをファイルに書き込む
byte[] readData = new byte[1024];
int readSize = 0;
for (;;)
{
    readSize = strm.Read(readData, 0, readData.Length);
    if (readSize == 0)
        break;
    fs.Write(readData, 0, readSize);
}

//省略
  • 履歴:
  • 2006/11/20 Read、Writeメソッドを使用した例を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。