HOWTO · C++

C++ でファイルをダウンロードする

このチュートリアルでは、C++ を使用してファイルをダウンロードする方法を示します。

このチュートリアルでは、C++ を使用してファイルをダウンロードする方法を示します。

C++ でファイルをダウンロードする

C++ を使用したファイルのダウンロードは、win32 API [URLDownloadToFile] を使用して実行できる簡単な操作です。 この API は、指定されたリンクからコンピューターにファイルをダウンロードできます。

必要に応じて、ダウンロードしたアイテムをファイルまたは文字列として保存できます。 これらは両方とも、異なる操作を使用して実行できます。

ファイルとしてダウンロードすることから始めましょう。

C++ ファイルとしてダウンロード

上記のように、win32 API [URLDownloadToFile]) を使用できます。指定されたリンクから任意のファイルをダウンロードできます。 ファイルは同じ作業ディレクトリに保存されます。

例を試してみましょう。

#include <windows.h>

#include <cstdio>
#include <string>
#pragma comment(lib, "Urlmon.lib")

using namespace std;

int main() {
  // the URL from where the file will be downloaded
  string SourceURL = "https://picsum.photos/200/300.jpg";

  // destination file
  string DestinationFile = "DemoFile.jpg";

  // URLDownloadToFile returns S_OK on success
  if (S_OK == URLDownloadToFile(NULL, SourceURL.c_str(),
                                DestinationFile.c_str(), 0, NULL)) {
    printf("The file is successfully downloaded.");

    return 0;

  }

  else {
    printf("Download Failed");
    return -1;
  }
}

上記のコードをコンパイルする前に、上記のコードは、Visual Studio Express、Visual C++、またはその他の関連するコンパイラを使用する NSVC コンパイラでのみ機能することに注意してください。 URLDownloadToFile API が含まれていないため、MinGW コンパイラーでは機能しません。

上記のコードを実行すると、リンクからファイルがダウンロードされます。

出力を参照してください。

The file is successfully downloaded.

C++ダウンロードファイル

バイト文字列としての C++ ダウンロード

このメソッドは、win32 API URLOpenBlockingStream を使用して、ファイルに保存できるバイト文字列としてファイルをダウンロードします。 これはトリッキーな段階的なプロセスです。 以下の手順に従ってください。

  1. まず、URLOpenBlockingStream を使用して、URL への IStream インターフェイスを取得します。
  2. 次に、HTTP プロトコルと HTTPS プロトコルの両方が機能する URL を挿入します。
  3. IStream が利用可能になったら、read 関数を使用してバイトをダウンロードします。 ここでループを使用する必要があるかもしれません。
  4. バイトが文字列に収集されたら、それらをファイルに保存するか、文字列をダウンロードできます。

上記の手順に基づいた例を試して、Google ホームページをバイト単位で取得してみましょう。

#pragma comment(lib, "urlmon.lib")
#include <urlmon.h>

#include <cstdio>
#include <iostream>
#include <string>
#define getURL URLOpenBlockingStreamA

using namespace std;

int main() {
  IStream* DemoStream;
  const char* SourceURL = "http://google.com";

  if (getURL(0, SourceURL, &DemoStream, 0, 0)) {
    cout << "An Error has occured.";
    cout << "Please Check the internet";
    cout << "Please Check the source URL.";
    return -1;
  }

  // this char array will be filled with bytes from the URL
  char DemoBuff[100];
  // keep appending the bytes to this string
  string DemoStr;
  unsigned long Bytes_Read;

  while (true) {
    DemoStream->Read(DemoBuff, 100, &Bytes_Read);
    if (0U == Bytes_Read) {
      break;
    }
    // appending and collecting to the string
    DemoStr.append(DemoBuff, Bytes_Read);
  };

  DemoStream->Release();
  cout << DemoStr << endl;
  return 0;
}

上記のコードは、Google ホームページをバイト文字列で取得します。 何かをバイト列でダウンロードするのは効率的ではありませんが、バイトをファイルに保存して後で使用することもできます。 上記のコードの出力は、長いバイト文字列になります。

URLOpenBlockingStreamMinGW C++ コンパイラでも機能しないため、最初のコードと同じコンパイラで上記のコードを実行してください。