[C#] WebBrowserでのファイルダウンロード方法
C#のWebBrowser
コントロールは、Webページの表示や簡単なブラウジング機能を提供しますが、ファイルのダウンロードを直接サポートしていません。
ファイルをダウンロードするには、WebBrowser
のNavigating
イベントを利用して、ダウンロードリンクを検出し、WebClient
やHttpClientクラス
を使ってファイルをダウンロードする方法があります。
Navigating
イベントでリンクのURLを取得し、そのURLをWebClient
のDownloadFileメソッド
に渡すことで、指定したパスにファイルを保存できます。
これにより、WebBrowser
でのファイルダウンロードを実現できます。
- WebBrowserコントロールの活用法
- WebClientを使ったファイルダウンロード
- HttpClientによる非同期処理
- ダウンロードの進捗表示方法
- 複数ファイルの一括ダウンロード方法
WebBrowserでのファイルダウンロード方法
Navigatingイベントの活用
WebBrowserコントロールのNavigatingイベントを利用することで、ユーザーがリンクをクリックした際にファイルをダウンロードする処理を実装できます。
以下は、Navigatingイベントを使用してファイルをダウンロードするサンプルコードです。
using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
webBrowser1.Navigating += WebBrowser1_Navigating; // Navigatingイベントの登録
webBrowser1.Navigate("https://google.com"); // Googleのページをダウンロードする
}
private void WebBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
// ダウンロードするURLを取得
string url = e.Url.ToString();
// WebClientを使用してファイルをダウンロード
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(url, "ダウンロードしたファイル名.html"); // ファイル名を指定
}
e.Cancel = true; // WebBrowserのナビゲーションをキャンセル
}
}
このコードでは、WebBrowserコントロールがリンクをクリックした際に、指定したURLからファイルをダウンロードします。
ダウンロードが完了した後、WebBrowserのナビゲーションはキャンセルされます。
WebClientクラスを使ったダウンロード
WebClientクラス
を使用することで、簡単にファイルをダウンロードできます。
以下は、WebClientを使ったファイルダウンロードのサンプルコードです。
using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
private void DownloadFile(string url, string fileName)
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(url, fileName); // 指定したURLからファイルをダウンロード
}
}
}
このメソッドを呼び出すことで、指定したURLからファイルをダウンロードし、指定したファイル名で保存します。
HttpClientクラスを使ったダウンロード
HttpClientクラス
は、非同期処理を行うためのクラスで、ファイルのダウンロードにも利用できます。
以下は、HttpClientを使ったファイルダウンロードのサンプルコードです。
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
private async Task DownloadFileAsync(string url, string fileName)
{
using (HttpClient httpClient = new HttpClient())
{
var response = await httpClient.GetAsync(url); // URLからデータを取得
response.EnsureSuccessStatusCode(); // ステータスコードが成功であることを確認
var content = await response.Content.ReadAsByteArrayAsync(); // バイト配列として取得
System.IO.File.WriteAllBytes(fileName, content); // ファイルに書き込む
}
}
}
このメソッドは非同期で動作し、指定したURLからファイルをダウンロードして指定したファイル名で保存します。
非同期処理を使用することで、UIがフリーズすることを防ぎます。
ダウンロードの進捗表示
ファイルのダウンロード中に進捗を表示することも可能です。
WebClientクラス
を使用した場合、DownloadProgressChangedイベントを利用して進捗を表示できます。
以下はそのサンプルコードです。
using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
private void DownloadFile(string url, string fileName)
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged; // 進捗イベントの登録
webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted; // 完了イベントの登録
webClient.DownloadFileAsync(new Uri(url), fileName); // 非同期でダウンロード開始
}
}
private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// 進捗を表示
progressBar1.Value = e.ProgressPercentage; // プログレスバーに進捗を設定
}
private void WebClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
// ダウンロード完了時の処理
MessageBox.Show("ダウンロードが完了しました!"); // メッセージボックスで通知
}
}
このコードでは、ダウンロードの進捗をプログレスバーに表示し、ダウンロードが完了した際にメッセージボックスで通知します。
非同期でダウンロードを行うため、UIがスムーズに動作します。
応用例
ダウンロードの自動化
ダウンロードの自動化を行うことで、特定のURLから定期的にファイルをダウンロードすることができます。
以下は、指定したURLから自動的にファイルをダウンロードするサンプルコードです。
using System;
using System.Windows.Forms;
using System.Net;
using System.Timers;
public partial class MyForm : Form
{
private Timer timer; // タイマーの宣言
public MyForm()
{
InitializeComponent();
timer = new Timer(60000); // 1分ごとにダウンロード
timer.Elapsed += Timer_Elapsed; // タイマーのイベント登録
timer.Start(); // タイマー開始
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
DownloadFile("http://example.com/file.ext", "自動ダウンロードファイル.ext"); // 自動ダウンロード
}
private void DownloadFile(string url, string fileName)
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(url, fileName); // 指定したURLからファイルをダウンロード
}
}
}
このコードでは、1分ごとに指定したURLからファイルを自動的にダウンロードします。
タイマーを使用することで、定期的な処理が可能になります。
複数ファイルの一括ダウンロード
複数のファイルを一括でダウンロードする場合、URLのリストを用意し、ループ処理を使ってダウンロードを行います。
以下はそのサンプルコードです。
using System;
using System.Windows.Forms;
using System.Net;
using System.Collections.Generic;
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
private void DownloadFiles(List<string> urls)
{
foreach (var url in urls) // URLリストをループ
{
string fileName = System.IO.Path.GetFileName(url); // ファイル名を取得
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(url, fileName); // 各URLからファイルをダウンロード
}
}
}
}
このメソッドを呼び出すことで、指定したURLリストからファイルを一括でダウンロードできます。
ダウンロード完了後の処理
ダウンロードが完了した後に特定の処理を行うことも可能です。
以下は、ダウンロード完了後にファイルの移動を行うサンプルコードです。
using System;
using System.Windows.Forms;
using System.Net;
using System.IO;
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
private void DownloadFile(string url, string fileName)
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadFile(url, fileName); // ファイルをダウンロード
MoveFile(fileName, "移動先フォルダ/" + Path.GetFileName(fileName)); // ダウンロード後にファイルを移動
}
}
private void MoveFile(string sourceFile, string destFile)
{
File.Move(sourceFile, destFile); // ファイルを移動
}
}
このコードでは、ファイルのダウンロードが完了した後に、指定したフォルダにファイルを移動します。
ダウンロードのキャンセル機能
ダウンロード中にユーザーがキャンセルできる機能を実装することも可能です。
以下は、ダウンロードをキャンセルするためのサンプルコードです。
using System;
using System.Windows.Forms;
using System.Net;
public partial class MyForm : Form
{
private WebClient webClient; // WebClientの宣言
public MyForm()
{
InitializeComponent();
}
private void StartDownload(string url, string fileName)
{
webClient = new WebClient();
webClient.DownloadFileAsync(new Uri(url), fileName); // 非同期でダウンロード開始
}
private void CancelDownload()
{
if (webClient != null && webClient.IsBusy) // ダウンロード中か確認
{
webClient.CancelAsync(); // ダウンロードをキャンセル
}
}
}
このコードでは、ダウンロード中にキャンセルボタンを押すことで、ダウンロードを中止することができます。
CancelAsyncメソッド
を使用することで、非同期ダウンロードをキャンセルできます。
よくある質問
まとめ
この記事では、C#のWebBrowserコントロールを使用したファイルダウンロードの方法について詳しく解説しました。
具体的には、Navigatingイベントの活用やWebClient、HttpClientを用いたダウンロード手法、さらにはダウンロードの進捗表示や自動化、複数ファイルの一括ダウンロードなどの応用例についても触れました。
これらの知識を活かして、実際のアプリケーションにファイルダウンロード機能を実装してみてください。