FTP サーバーに接続して Download する

FTP サーバーに接続して Download する最も簡単なプログラムです。

Web サーバーと違い FTP サーバーは一般的に「専用の ID や Password」が必要で、プロバイダと契約を結んで使用します。
プログラムの開発をする場合は、自分の開発マシンに FTP サーバー機能を直接組み込む方法がお勧めです。
無料で FTP サーバーを構築する方法は FTP サーバーを構築する を参照して下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. 空のプロジェクトを作成して main.cpp をプロジェクトに追加します。
  2. 次の領域に文字列を設定して下さい。
        char        szUserName[64]=         "プロバイダから指定されたID";
        char        szPassWord[64]=         "パスワード";
        char        szHost[64]=             "FTP アドレス";
        char        szBaseDir[64]=          "基準ディレクトリ";
        char        szFName[MAX_PATH]=      "Download するファイル名";
        char        szLocalFile[MAX_PATH]=  "格納するフォルダーとファイル名";
        
    例えば次のようになります。
        char        szUserName[64]=         "MAEDA";
        char        szPassWord[64]=         "password";
        char        szHost[64]=             "ftp.host.or.jp";
        char        szBaseDir[64]=          "./";
        char        szFName[MAX_PATH]=      "index.html";
        char        szLocalFile[MAX_PATH]=  "c:\\index.html";
        
  3. ビルドから実行すると、実行の経過が Dialog Box で表示されます。
    "c:\index.html を無事ダウンロードできました" が表示されたら完成です。
    Cドライブのルート(c:\) に Download された index.html ファイルを確認して下さい。


プログラムの説明

  1. windows.h と wininet.h をインクルードして、wininet.lib をリンクします。
    hInternet はインターネットハンドルで、hHost はホストコンピュータのハンドルです。
        #include <windows.h>
        #include <wininet.h>
    
        #pragma once
        #pragma comment(lib,"wininet.lib")
    
        // WinInet で使用する領域
        HINTERNET   hInternet;              //インターネットハンドル
        HINTERNET   hHost;                  //ホストのハンドル
        
  2. InternetOpen() でインターネットハンドラを作成します。
        int PASCAL  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
        {
            hInternet= InternetOpen("FTPSample",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
            if (hInternet==NULL)
            {   MessageBox(NULL,"インターネットを開けません","失敗",MB_OK);
                return FALSE;
            }
        
  3. InternetConnect() 関数で FTP ホストコンピュータに接続します。
            hHost= InternetConnect(hInternet,
                szHost,
                INTERNET_INVALID_PORT_NUMBER, 
                szUserName,
                szPassWord,
                INTERNET_SERVICE_FTP,
                INTERNET_FLAG_PASSIVE,
                0);
            if (hHost==NULL)
            {   MessageBox(NULL,"接続中にエラー発生","OK",MB_OK);
                InternetCloseHandle(hInternet);
                return FALSE;
            }
        
  4. FtpSetCurrentDirectory() でホスト側のディレクトリを設定します。
            if (!FtpSetCurrentDirectory(hHost,szBaseDir))
            {   MessageBox(NULL,"ディレクトリの設定ができません","失敗",MB_OK);
                return FALSE;
            }
            MessageBox(NULL,"FTPに接続しました","接続完了",MB_OK);
        
  5. FtpGetFile() でファイルを Download します。
            if (!FtpGetFile(hHost,      //FTPのインターネットハンドル
                szFName,                //ダウンロードするファイル
                szLocalFile,            //ダウンロード先のパス付ファイル名
                TRUE,                   //ダウンロード先に同名のファイルがあるときエラーにする(上書き防止)
                FILE_ATTRIBUTE_NORMAL,  //ダウンロード先に作られるファイルのアトリビュート
                FTP_TRANSFER_TYPE_BINARY, //バイナリファイルとしてダウンロード
                0))
            {   MessageBox(NULL,"ダウンロードに失敗しました。","失敗",MB_OK);
                return FALSE;
            }
            MessageBox(NULL,"c:\index.html を無事ダウンロードできました","OK",MB_OK);
        
  6. 使用したハンドラをクローズします。
            InternetCloseHandle(hHost);
            if (InternetCloseHandle(hInternet))
                MessageBox(NULL,"インターネットから切り離しました","OK",MB_OK);
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)