大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

WebClientでのファイルダウンロード

著者:北本 敦
公開日:2023/04/29
最終更新日:2023/08/31
カテゴリー:技術情報
タグ:

北本です。

プログラミングをやっているなら、実務だけでなくプライベートな場面でもそれを役立てたいものでありますが、個人的に最も活用しているのがウェブサイトから一括で画像などのファイルをダウンロードするときです。こういったプログラムは慣れればサクッと作成でき、初心者でも割と手を付けやすい領域だと思います。今回は、規則性のある名称の画像ファイルをまとめて保存するプログラムをC#で作成します。

サーバのあるディレクトリ内に以下のような条件で複数のJPG画像が配置されているものとします。

  • ファイル名は「親番_枝番.jpg」という形式である。
  • 親番は1から始まり、歯抜けはないが、最後の数はわからない。
  • 枝番は各親番ごとに、1から始まる連番が振られている。
  • 枝番も歯抜けはないが、最後の数はわからない。また、各親番ごとに最後の数は異なる。

例えば、以下のような名前でファイルが存在する感じです。
1_1.jpg、1_2.jpg、1_3.jpg
2_1.jpg、2_2.jpg
3_1.jpg、3_2.jpg、3_3.jpg、3_4.jpg

これらを全てダウンロードして保存するプログラムをC#の.Net Frameworkのコンソールアプリケーションとして作成します。

ここではローカルホストで試します。
http://localhost/images/に上記のような画像を配置します。

保存先は実行ファイルのディレクトリ配下の「download」フォルダとし、ファイル名は「saved_image_親番_枝番.jpg」とします。

以下のようなコードになります。

using System.IO;
using System.Net;

namespace ImageDownloader
{
    class Program
    {
        static void Main(string[] args)
        {
            // 実行ファイルのディレクトリ配下のdownloadフォルダを保存先とする
            string saveFolder = @"./download";
            if (!Directory.Exists(saveFolder))
            {
                // フォルダが存在しなければ作成
                Directory.CreateDirectory(saveFolder);
            }

            using (WebClient wc = new WebClient())
            {
                string urlFormat = @"http://localhost/images/{0}_{1}.jpg";

                int i = 1;  // 親番
                int j = 1;  // 枝番
                while (true)
                {
                    while (true)
                    {
                        string url = string.Format(urlFormat, i, j);
                        string fileName = string.Format(@"saved_image_{0}_{1}.jpg", i, j);
                        string saveFilePath = Path.Combine(saveFolder, fileName);
                        try
                        {
                            // ファイルをダウンロード
                            wc.DownloadFile(url, saveFilePath);
                        }
                        catch
                        {
                            // エラーでダウンロードできなかった場合、ファイルが存在しなかったものとみなしループを抜ける
                            break;
                        }

                        // 枝番を1つ進める
                        j++;
                    }

                    if (j == 1)
                    {
                        // 枝番「1」が存在しなかった場合、親番の最後の数を超えたとみなし終了
                        break;
                    }

                    // 親番を1つ進め、枝番を1に戻す
                    i++;
                    j = 1;
                }
            }
        }
    }
}

WebClient.DownloadFileで第1引数に指定したURLのファイルを第2引数に指定したパスにダウンロードしています。404エラーが返ってきた場合には例外が発生しますので、それによってファイルの存在有無を判断しています。404以外のエラーの場合でも例外が発生しますが、ここでは考慮しないものとします。

ただ、このように404エラーで判断する方法ではうまくいかない場合があったので、それについて次回に紹介したいと思います。

    上に戻る