山本ワールド
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.
      
      
    