WinInetによるFTPサーバへの接続



ここでは、WinInetを使用してFTPサーバへの接続やファイルのアップロードなどの
方法を示します。


WinInetのAPIを使用するためには、以下の Header と Library が必要です。

    Header  : wininet.h
    Library : WinInet.lib

【サンプル】


#include <wininet.h>

class CFtpSap
{
public:
    CFtpSap(void);
    ~CFtpSap(void);

private:
    //Handle
    HINTERNET hInet, hConnection;

public:
    // ftpサーバへ接続
    int Connect_ftp(void);
    // ftp接続を切断
    int Disconnect_ftp(void);
    // カレントディレクトリを変更
    int ChCur_ftp(void);
    // カレントディレクトリ内のファイルを検索
    int Findfile_ftp(void);
    // ファイルをダウンロード
    int GetFile_ftp(void);
    // ファイルをアップロード
    int PutFile_ftp(void);
};

#include "FtpSap.h"


CFtpSap::CFtpSap(void)
{
}

CFtpSap::~CFtpSap(void)
{
}

// ftpサーバへ接続
int CFtpSap::Connect_ftp(void)
{
    //WinINet functionsを初期化
    hInet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 );
    
    //Ftpサーバへ接続
    CString strIPA, strUser, strPW;

    strIPA = "ftpサーバ名";
    strUser = "接続ユーザ名";
    strPW = "パスワード";

    hConnection = InternetConnect(hInet, strIPA, INTERNET_DEFAULT_FTP_PORT,
                                 strUser, strPW, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);

    if(hConnection == NULL){
        InternetCloseHandle(hInet);
        return 0;
    }

    return 1;

}

// ftp接続を切断
int CFtpSap::Disconnect_ftp(void)
{
    if(InternetCloseHandle(hConnection) == false) return 0;
    if(InternetCloseHandle(hInet) == false) return 0;
    
    return 1;
}

// カレントディレクトリを変更
int CFtpSap::ChCur_ftp(void)
{
    //カレントディレクトリの変更
    BOOL BRet = FtpSetCurrentDirectory(hConnection, "変更先ディレクトリ");

    if(BRet == false){
        return 0;
    }
    
    return 1;

}

// カレントディレクトリ内のファイルを検索
int CFtpSap::Findfile_ftp(void)
{
    CStringArray ResultFiles;
    WIN32_FIND_DATA w32FindData; 
    HINTERNET hFind;
    int cnt;

    cnt = 0;

    //ファイルの検索
    hFind = FtpFindFirstFile(hConnection, "*.*", &w32FindData, INTERNET_FLAG_RELOAD, 0);
    do{
        //Sets the client message to memory.
        if(w32FindData.cFileName != NULL){
            ResultFiles.Add(w32FindData.cFileName);
            cnt++;
        }

    }while(TRUE == InternetFindNextFile(hFind, &w32FindData));

    InternetCloseHandle(hFind);

    return cnt;

}
// ファイルをダウンロード
int CFtpSap::GetFile_ftp(void)
{
    BOOL BRet = FtpGetFile(hConnection, "ftpサーバ内の取得ファイル名", "保存ファイル名",
                        FALSE,  FILE_ATTRIBUTE_NORMAL,INTERNET_FLAG_TRANSFER_BINARY, 0);
    if(BRet == false){
        return -1;
    }

    return 0;
}

// ファイルをアップロード
int CFtpSap::PutFile_ftp(void)
{
    BOOL BRet = FtpPutFile(hConnection, "アップロードファイル名", "ftpサーバへの保存ファイル名",
                           INTERNET_FLAG_TRANSFER_BINARY, 0);

    if(BRet == false){
        return -1;
    }

    return 1;

}


[サンプル・ソース]