概要

指定した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