山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他インターネットよりファイルを読み出す(バイナリ)
概要
指定したURLのファイルをインターネットから取得しファイルに保存します。
文字コードや改行コードの変換を行わずそのままファイルに保存されます。
使用方法はコマンドプロンプトを実行し、以下のように入力します。
以下の場合、私のホームページのトップページをファイルtest.htmlに保存します。
文字コードや改行コードの変換を行わずそのままファイルに保存されます。
使用方法はコマンドプロンプトを実行し、以下のように入力します。
以下の場合、私のホームページのトップページをファイルtest.htmlに保存します。
wgetbin http://yamatyuu.net test.htmlインターネットからの読み込みにはWININETを使用しています。
テスト環境
コンパイラ
Visual C++ 2008 Standard 32/64bitVisual C++ 2013 Express 32/64bit
プロジェクトの作成
Win32プロジェクト Windowsコンソールアプリケーション実行環境
Windows 8.1 Enterprise 64bitWindows 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; // ファイルサイズを返す
}
ソースファイルと実行ファイルのダウンロード
Copyright (C) 2012 山本ワールド All Rights Reserved.