HTTP/FTP経由でのファイル取得(wininet.dll)

解説


 Wininet.dllを利用してインターネット上からファイルをダウンロードする方法。
 URLを変えることでHTTPでもFTPでもダウンロードできる。



使用例


	DownloadTest("http://www.dinop.com//test.exe","c:\\test.exe");
	DownloadTest("ftp://userId:password@www.dinop.com//test.exe","c:\\test.exe");



ソースコード



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


bool	DownloadTest(LPCTSTR pszURL,LPCTSTR pszLocalFile,DWORD dwBuffSize=1024)
{
	TCHAR		pszHeader[] = _T("Accept: */*\r\n\r\n");
	BOOL		ret;
	DWORD		dwReadSize;
	DWORD		dwWrittenSize;
	BYTE*		pcbBuff;
	HINTERNET	hInternet;
	HINTERNET	hConnect;
	HRESULT		hr;
	CAtlFile	cFile;

	pcbBuff = new BYTE[dwBuffSize];
	if(pcbBuff == NULL)
		return	false;

	hr = cFile.Create(pszLocalFile,GENERIC_WRITE,0,CREATE_NEW);		//ファイルがあれば失敗
	if(FAILED(hr))
	{
		delete	pcbBuff;
		return	false;
	}

	hInternet = ::InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
	if(hInternet == NULL)
	{
		delete	pcbBuff;
		return	false;
	}

	hConnect = ::InternetOpenUrl(hInternet,pszURL,pszHeader,lstrlen(pszHeader),INTERNET_FLAG_DONT_CACHE,0);
	if(hConnect == NULL)
	{
		::InternetCloseHandle(hInternet);
		delete	pcbBuff;
		return	false;
	}

	while(1)
	{
		::Sleep(0);
		ret = ::InternetReadFile(hConnect,pcbBuff,dwBuffSize,&dwReadSize);
		if(ret)
		{
			if(dwReadSize == 0)
				break;

			hr = cFile.Write(pcbBuff,dwReadSize,&dwWrittenSize);
			if(SUCCEEDED(hr))
				continue;
		}

		cFile.Close();
		::InternetCloseHandle(hConnect);
		::InternetCloseHandle(hInternet);
		delete	pcbBuff;

		return	false;
	}

	hr = cFile.Flush();
	cFile.Close();
	::InternetCloseHandle(hConnect);
	::InternetCloseHandle(hInternet);
	delete	pcbBuff;

	return	SUCCEEDED(hr) ? true : false;
}


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