山本ワールド
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 その他コマンドプロンプト上でインターネット上のファイルの有無、サイズ、日時を取得する(32/64bit)
概要
          コマンドプロンプト上で指定されたURLのファイルの有無を確認しサイズと更新日時を取得します。以下に動作例を示します。
          
        C:¥>inetdate http://yamatyuu.net
54589 2016年07月18日 08時53分00秒 200 http://yamatyuu.netテスト環境
コンパイラ
Visual C++ 2008/2013 Express 32/64bit マルチバイト/UNICODE実行環境
Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)Windows 7 Enterprise Service Pack 1 64bit
Windows 10 Home
プログラムソースの概要
inetdate.cpp
_tmain
HtmlGet2関数を呼び出し、ステータス、ファイルサイズ、更新日時を取得します。取得されたステータス、ファイルサイズ、更新日時を標準出力に出力します。
HtmlGet2
InternetCrackUrl APIによりURLからサーバー名等を取得します。インターネットのサービスをInternetOpen APIによりオープンします。
InetrnetConnect APIによりサーバーに接続します。
HttpOpenRequest APIによりサーバーリクエストを初期化し、HttpSendRequest APIによりリクエストします。
HttpQueryInfo APIによりリクエストに対するステータス(答え)を取得します。 この時、エラーステータスが返された場合、終了します。ここでいうエラーとはお馴染みの403等です。
HttpQueryInfo APIによりファイルサイズを取得します。
HttpQueryInfo APIによりファイルの更新日時を取得します。
更新日時は世界標準時なので日本時間に変換します。
各ハンドルをInternetCloseHandle APIにより閉じます。
ソースコード
inetdate.cpp
//       インターネット上のファイルの有無、サイズ、日時を取得する
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include "resource.h"
#pragma comment(lib,"wininet.lib")
//      インターネット上のファイルの有無、サイズ、日時を取得する
bool HtmlGet2(TCHAR* url,DWORD* status_code,DWORD* sz,SYSTEMTIME* LocalTime);
int _tmain(int argc,TCHAR** argv){
        _tsetlocale(LC_ALL, _TEXT(""));       //      UNICODE文字を標準出力に正しく表示できるように
        if(argc!=2){
                _tprintf(_TEXT("使い方¥n  inetdate url名¥n"));
                exit(1);
        }
    TCHAR* url=argv[1];
        SYSTEMTIME LocalTime;
        DWORD s,sz;
        if(HtmlGet2(argv[1],&s,&sz,&LocalTime)==true){
                _tprintf(_TEXT("%i "),sz);
                _tprintf(_TEXT("%.4i年%.2i月%.2i日 %.2i時%.2i分%.2i秒"),LocalTime.wYear , LocalTime.wMonth , LocalTime.wDay , LocalTime.wHour , LocalTime.wMinute , LocalTime.wSecond);
                _tprintf(_TEXT(" %i %s¥n"),s,url);
        }else{
                _tprintf_s(_TEXT("0 0 %i %s¥n"),s,url);
        }
}
//      インターネット上のファイルの有無、サイズ、日時を取得する
bool HtmlGet2(TCHAR* url,DWORD* status_code,DWORD* sz,SYSTEMTIME* LocalTime){
        URL_COMPONENTS uc;
        HINTERNET hiopen;
        HINTERNET hiconnect;
        HINTERNET hirequest;
        TCHAR host_name[64];
        TCHAR path[64];
        TCHAR buf[64];
        ZeroMemory(&uc , sizeof(URL_COMPONENTS));
        uc.dwStructSize=sizeof(URL_COMPONENTS);
        uc.lpszHostName=host_name;
        uc.lpszUrlPath=path;
        uc.dwHostNameLength=sizeof(host_name)/sizeof(TCHAR);
        uc.dwUrlPathLength=sizeof(path)/sizeof(TCHAR);
//      URLの解析
        unsigned url_len=(unsigned)_tcslen(url);
        if( InternetCrackUrl(url , url_len , ICU_ESCAPE , &uc )==FALSE){
                MessageBox(0,_TEXT("InternetCrackUrl:URLの解析に失敗しました。"),_TEXT("エラー"),MB_OK);
                return false;
        }
        DWORD flags=0;
        if(uc.nScheme==INTERNET_SCHEME_HTTP){
                flags= INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_NO_AUTO_REDIRECT;
        }else if(uc.nScheme==INTERNET_SCHEME_HTTPS){
                flags=INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE |  INTERNET_FLAG_NO_AUTO_REDIRECT
                        | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
                        | INTERNET_FLAG_IGNORE_CERT_CN_INVALID;
        }else{
                MessageBox(0,_TEXT("HTTPでもHTTPSでもありません"),_TEXT("エラー"),MB_OK);
                return false;
        }
        _stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%s"),uc.lpszUrlPath);
//      インターネットのサービスハンドルの取得(レジストリ内のIEの設定を使用)
        hiopen=InternetOpen(_TEXT("inetdemo"),INTERNET_OPEN_TYPE_PRECONFIG,   NULL, NULL, 0 );
        if(hiopen==NULL){
                MessageBox(0,_TEXT("InternetOpenで初期化に失敗しました"),_TEXT("エラー"),MB_OK);
                return false;
        }
//      HTTPサーバーへの接続
        hiconnect=InternetConnect(hiopen , uc.lpszHostName , uc.nPort , NULL , NULL , INTERNET_SERVICE_HTTP , 0 , 0);
        if(hiconnect==NULL){
                InternetCloseHandle(hiopen);
                MessageBox(0,_TEXT("InternetConnectでHTTP接続に失敗しました"),_TEXT("エラー"),MB_OK);
                return false;
        }
//      HTTPサーバーへのリクエストの初期化
        hirequest=HttpOpenRequest(hiconnect,_TEXT("GET"),buf,NULL,NULL,NULL,flags,NULL);
        if(hirequest==NULL){
                InternetCloseHandle(hiconnect);
                InternetCloseHandle(hiopen);
                MessageBox(0,_TEXT("HttpOpenRequestでHTTP接続に失敗しました"),_TEXT("エラー"),MB_OK);
                return false;
        }
        if(HttpSendRequest(hirequest , NULL , 0 , NULL , 0)==FALSE){
                InternetCloseHandle(hirequest);
                InternetCloseHandle(hiconnect);
                InternetCloseHandle(hiopen);
                MessageBox(0,_TEXT("HtpSendRequestでHTTP要求送信に失敗しました"),_TEXT("エラー"),MB_OK);
                return false;
        }
//      HTTPリクエストに関連する情報を取得する(ステータスコードを32ビットで返す)
        *status_code=0;
        DWORD len=sizeof(DWORD);
        if(HttpQueryInfo( hirequest , HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,status_code,&len,0)==FALSE){
                InternetCloseHandle(hirequest);
                InternetCloseHandle(hiconnect);
                InternetCloseHandle(hiopen);
                *status_code=0xffffffff;
                return false;
        }
        if( *status_code != HTTP_STATUS_OK){    //      エラーがー発生した
                InternetCloseHandle(hirequest);
                InternetCloseHandle(hiconnect);
                InternetCloseHandle(hiopen);
                return false;
        }
        //      ファイルサイズの取得
        *sz=0;
        len=sizeof(*sz);
        if(HttpQueryInfo( hirequest , HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,sz,&len,0)==TRUE){
        }
        SYSTEMTIME UTCTime;
        len=sizeof(UTCTime);
        if(HttpQueryInfo( hirequest ,HTTP_QUERY_LAST_MODIFIED | HTTP_QUERY_FLAG_SYSTEMTIME ,&UTCTime,&len,0)==TRUE){
                FILETIME FileTime, LocalFileTime;
                SystemTimeToFileTime(&UTCTime,&FileTime);
                FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
                FileTimeToSystemTime(&LocalFileTime, LocalTime);
        }
        InternetCloseHandle(hirequest);
        InternetCloseHandle(hiconnect);
        InternetCloseHandle(hiopen);
        return true;
}ソースコードと実行ファイルのダウンロード
        Copyright (C) 2012 山本ワールド All Rights Reserved.
      
      
    