FTPによるアップロード/ダウンロード(wininet.dll)

解説


 Wininet.dllを利用してFTPサーバーからファイルを取得したり、ファイルをアップロード する方法。
 (ブロッキング動作であれば)InternetOpen、InternetConnect、FtpGetFileやFtpPutFile というAPIを利用することで簡単にできてしまう。



ソースコード


 PC内のboot.iniファイルをアップロードし、アップロードしたファイルを名前を変えてダウンロード する。

※ソースコード内のログイン名やパスワードは有効な値ではありません。適宜変更してください。

#include "wininet.h"
#pragma	comment(lib,"wininet.lib")

bool	EasyGetFile(LPCTSTR pszRemoteFile,LPCTSTR pszLocalFile,LPCTSTR pszServer,LPCTSTR pszUserID,LPCTSTR pszPassword);
bool	EasyPutFile(LPCTSTR pszLocalFile,LPCTSTR pszRemoteFile,LPCTSTR pszServer,LPCTSTR pszUserID,LPCTSTR pszPassword);

bool	Test()
{
	bool	ret;

	ret = EasyPutFile(_T("c:\\boot.ini"),_T("/home/issei/htdocs/boot.ini"),_T("www.xxx.com"),_T("admin54"),_T("784b20nkdfa"));
	if(ret)
		EasyGetFile(_T("/home/issei/htdocs/boot.ini"),_T("c:\\boot2.ini"),_T("www.xxx.com"),_T("admin54"),_T("784b20nkdfa"));

	return	ret;
}


//
//	FTPによるファイルの簡易ダウンロード
//
//	ブロッキング動作!
//
//	pszRemoteFile	: サーバー側のファイルパスを指定。ex."/htdocs/index.html"
//	pszLocalFile	: ローカル側のファイルパスを指定。ex."c:\\index.html"
//	pszServer		: FTPサーバー名。ex."www.dinop.com"
//	pszUserID		: サーバーへのログインID。ex."issei"
//	pszPassword		: パスワード。ex."4hk48gf1dfs"
//
bool	EasyGetFile(LPCTSTR pszRemoteFile,LPCTSTR pszLocalFile,LPCTSTR pszServer,LPCTSTR pszUserID,LPCTSTR pszPassword)
{
	BOOL		ret;
	HINTERNET	hInternet;
	HINTERNET	hFtp;

	hInternet	= NULL;
	hFtp		= NULL;
	ret			= FALSE;

	hInternet = ::InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
	if(hInternet)
		hFtp = ::InternetConnect(hInternet,pszServer,INTERNET_DEFAULT_FTP_PORT,pszUserID,pszPassword,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
	if(hFtp)
		ret = ::FtpGetFile(hFtp,pszRemoteFile,pszLocalFile,TRUE,0,FTP_TRANSFER_TYPE_BINARY,0);
	if(hFtp)
		::InternetCloseHandle(hFtp);
	if(hInternet)
		::InternetCloseHandle(hInternet);

	ATLASSERT(ret);
	return	ret ? true : false;
}


//
//	FTPによるファイルの簡易アップロード
//
//	ブロッキング動作!
//
//	pszLocalFile	: ローカル側のファイルパスを指定。ex."c:\\index.html"
//	pszRemoteFile	: サーバー側のファイルパスを指定。ex."/htdocs/index.html"
//	pszServer		: FTPサーバー名。ex."www.dinop.com"
//	pszUserID		: サーバーへのログインID。ex."issei"
//	pszPassword		: パスワード。ex."4hk48gf1dfs"
//
bool	EasyPutFile(LPCTSTR pszLocalFile,LPCTSTR pszRemoteFile,LPCTSTR pszServer,LPCTSTR pszUserID,LPCTSTR pszPassword)
{
	BOOL		ret;
	HINTERNET	hInternet;
	HINTERNET	hFtp;

	hInternet	= NULL;
	hFtp		= NULL;
	ret			= FALSE;

	hInternet = ::InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
	if(hInternet)
		hFtp = ::InternetConnect(hInternet,pszServer,INTERNET_DEFAULT_FTP_PORT,pszUserID,pszPassword,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
	if(hFtp)
		ret = ::FtpPutFile(hFtp,pszLocalFile,pszRemoteFile,FTP_TRANSFER_TYPE_BINARY,0);
	if(hFtp)
		::InternetCloseHandle(hFtp);
	if(hInternet)
		::InternetCloseHandle(hInternet);

	ATLASSERT(ret);
	return	ret ? true : false;
}


カテゴリー「VC++ TIPS」 のエントリー