概要

指定したURLのファイルをインターネットから取得しファイルに保存します。
文字コードや改行コードの変換を行わずそのままファイルに保存されます。
使用方法はコマンドプロンプトを実行し、以下のように入力します。
以下の場合、私のホームページのトップページをファイルtest.htmlに保存します。
wgetbin http://yamatyuu.net test.html
インターネットからの読み込みにはWININETを使用しています。

テスト環境

コンパイラ

Visual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit

プロジェクトの作成

Win32プロジェクト Windowsコンソールアプリケーション

実行環境

Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit

プログラムソースの概要

_tmain

UNICODE文字を標準エラー出力に正しく表示させるために_tsetlocale関数によりロケールを設定します。 InternetOpen APIによりインタネットハンドルを取得します。
APIが0を返した場合は、インタネットハンドルを取得できなかったので 標準エラー出力にエラーメッセージを表示しプログラムを終了させます。
_tfopen_sにより取得したデータを保存するためのファイルを書き込みでバイナリモードで開きファイルハンドルを取得します。
ファイルが開けなかった場合は、InternetCloseHandle APIによりインターネットハンドルを閉じて 標準エラー出力にエラーメッセージを表示しプログラムを終了させます。
webBinGet関数によりインタネット上のファイルを読み取り、ファイルに保存します。
InternetCloseHandle APIによりインターネットハンドルを閉じます。
fclose関数によりファイルハンドルを閉じます。

webBinGet

InternetOpenUrl APIにより指定URLをオープンしハンドルを取得します。
オープンできなかった場合は、 標準エラー出力にエラーメッセージを表示し関数を終了させます。
InternetReadFile APIによりインターネット上のファイルのうち指定したサイズ分を呼び出し、 fwrite関数によりファイルに書き込みます。
InternetReadFile APIの第4引数に指定したDWORDへのポインタを渡すと DWORDに読みだしたバイト数が返ってきます。
読みだしたバイト数が0以下になった場合は、インターネット上のファイルを最後まで読みだしたことになるので、 InternetCloseHandle APIによりInternetOpenUrl APIで取得したハンドルを閉じます。

プログラムソース

// インターネットより指定したurlを読み出し指定したファイルへ保存します。
//      Visual C++ 2008/2013 Unicode/マルチバイト

#include <windows.h>
#include <stdio.h>
#include <wininet.h>
#include <tchar.h>
#include <locale.h>

#pragma comment(lib,"wininet.lib")

//      指定URLからデータを取得してファイルに保存(バイナリ)
int webBinGet(HINTERNET hInet, TCHAR* url, FILE* fp);

int _tmain(int argc, TCHAR** argv){
        HINTERNET hInet;
        FILE* fp;

        //      UNICODE文字を標準エラー出力に正しく表示させるためにロケールを設定
        _tsetlocale(LC_ALL, _TEXT(""));

        if(argc!=3){
                _ftprintf(stderr,_TEXT("使用方法\nwgetbin [url] [保存ファイル名]\n"));
                return 1;
        }
        //インターネット(WinInet)開始
        hInet = InternetOpen(TEXT("wxz123"),
                INTERNET_OPEN_TYPE_PRECONFIG,   
                NULL, NULL, 0);
        if (hInet == NULL) {
                _ftprintf(stderr,_TEXT("インターネットのハンドルの作成に失敗しました\n"));
                return 2;
        }
        if (_tfopen_s(&fp, argv[2], TEXT("wb"))){
                InternetCloseHandle(hInet);
                _ftprintf(stderr,_TEXT("ファイルオープンエラー %s\n"),argv[2]);
                return 3;
        }
        if(webBinGet(hInet,argv[1],fp)<0)
                _ftprintf(stderr,_TEXT("インターネットから正常に読み込めませんでした\n"));
        InternetCloseHandle(hInet);
        fclose(fp);
        return 0;
}

//      指定URLからデータを取得してファイルに保存(バイナリ)

int webBinGet(HINTERNET hInet, TCHAR* url, FILE* fp){
        char buf[1024];
        HINTERNET hUrl;
        //HTTPセッションの開始, 指定のURLオープン
        hUrl = InternetOpenUrl(hInet, url, NULL, 0, 0, 0);
        if (hUrl == NULL) {
                _ftprintf( stderr,_TEXT("URLオープンエラー %s\n"),url);
                return -1;
        }
        //読み出す物がなくなるまで読み出す
        int len;
        int size = 0;
        for (;;){
                InternetReadFile(hUrl, buf, sizeof(buf), (LPDWORD)&len);
                if (len <= 0)
                        break;
                fwrite(buf, sizeof(buf[0]), len, fp);
                size += len;
        }
        InternetCloseHandle(hUrl);
        return len;     //      ファイルサイズを返す
}

ソースファイルと実行ファイルのダウンロード

ダウンロード wgetbin.zip(58.1kByte)
ZIPファイルに含まれるファイル
wgetbin.cpp
wgetbin.exe