質問: new System.Net.WebClient(); wc.DownloadFile("http://xxx.co.jp/downoad/csv", @"C:\Users\myuser\Desktop\1.csv"); wc.Dispose(); ``` がよく紹介されておりますが、この方法を使うと、ログインページのHTMLファイルをダウンロードしてしまいます。 webBrowserを使ってログインページをwebBrowserに表示させるところまでは出来るのですが、そこに張り付いているリンク先から、CSVファイルをダウンロードする方法は無いでしょうか? 例えば、webBrowserコントロールに、ファイルダウンロードのメッソドは無いのでしょうか? または、上記にあります、WebClientとは一体何でしょう?
回答: > > この方法を使うと、ログインページのHTMLファイルをダウンロードしてしまいます。 > > > それはダウンロード対象のURLがHTMLファイルのものだからです。CSVファイルをダウンロードしたいなら、`DownloadFile`メソッドにCSVファイルのURLを渡せば良いです。 > > webBrowserコントロールに、ファイルダウンロードのメッソドは無いのでしょうか? > > > WebBrowserのリファレンス.aspx)を見れば判ると思いますが、リンクをダウンロードするためのメソッドは用意されていません。 `WebBrowser`クラスにはユーザーの操作をシミュレートする機能(リンクのクリックとか送信ボタンを押すとか)はありますが、直接ダウンロードすることはできないと思います。 リンクのクリックを実行したとしても、ファイル保存ダイアログが表示されたりするので、期待する動作にはならないかもしれません。 > > WebClientとは一体何でしょう? > > > WebClientのリファレンス.aspx)にも書かれていますが、Webサーバーとのデータのやりとりを行うためのクラスです。 似たようなものに`HttpClient`というクラスがありますが、こちらはよりプロトコル寄りの実装で(メソッドもリクエスト名で付けられている)、細かい制御ができるようになっています。 以下は簡単なサンプルコードです。WebBrowserで表示しているページ内のリンクで、ファイル名の拡張子が".csv"のものをダウンロードします。 ``` using(var client = new WebClient()) { foreach(HtmlElement link in webBrowser.Document.Links) { string href = link.GetAttribute("href"); var url = new Uri(webBrowser.Url, href); string filename = Path.GetFileName(url.LocalPath); if(Path.GetExtension(filename).ToLower() == ".csv") { client.DownloadFile(url, filename); } } } ```