1. 程式人生 > >C程式碼實現從FTP上下載檔案

C程式碼實現從FTP上下載檔案

從FTP上下載檔案這個功能我早就想實現了,但是苦於百度的文章大多是下載連結,一直沒捨得積分下載,這次通過查閱MSDN,將一套下載流程函式摸了一下,寫出程式碼實現從FTP下載檔案

環境 VS2015

程式碼:

#include <iostream>
#include <windows.h>
#include <process.h>
#include <wininet.h>
//連結wininet.lib庫
#pragma comment(lib,"wininet.lib")
using namespace std;

int main()
{
	HINTERNET hINTSession;
	HINTERNET hFTPSession;

	char szAppname[MAX_PATH] = "FTP下載檔案.exe";
	char szServer[MAX_PATH] = "192.168.6.174";
	char szPort[MAX_PATH] = "21"; //可以不用設定,InternetConnect函式中有INTERNET_DEFAULT_FTP_PORT為使用預設21埠
	char szUsername[MAX_PATH] = "ljl";
	char szPassword[MAX_PATH] = "521125";
	char szFilePath[MAX_PATH] = "/圖片";  //一個反向的斜槓()或向前斜槓(/)可以用作任何名稱的目錄分隔符
	char szFileName[MAX_PATH] = "ascii.jpg";
	char szNewFileName[MAX_PATH] = "E:\\FtpDownload\\ascii.jpg";

	char szCurDir[MAX_PATH];
	DWORD dwCurDir = MAX_PATH;

	cout << "嘗試開啟 hINTSession" << endl;
	hINTSession = InternetOpenA(szAppname, INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);//這個函式初始化一個應用程式對WinInet函式的使用
	if (hINTSession == NULL)
	{
		cout << "無法開啟 hINTSession!" << endl;
		return -1;
	}
	else
	{
		cout << "開啟成功" << endl;
	}

	cout << "嘗試開啟 hFTPSession" << endl;

	//這個函式為指定的站點開啟一個FTP或HTTP會話
	hFTPSession = InternetConnectA(hINTSession,szServer, INTERNET_DEFAULT_FTP_PORT,szUsername,szPassword, INTERNET_SERVICE_FTP,0,0);
	if (hFTPSession == NULL)
	{
		InternetCloseHandle(hINTSession);
		cout << "連線FTP失敗!"<< endl;
	}
	else
	{
		cout << "連線成功" << endl;
	}

	ZeroMemory(szCurDir,dwCurDir);
	FtpGetCurrentDirectoryA(hFTPSession, szCurDir, &dwCurDir);  //這個函式檢索指定FTP會話的當前目錄
	//cout << szCurDir << endl;

	//FtpSetCurrentDirectory 這個函式會更改FTP伺服器上的不同工作目錄
	BOOL bsuccess;
	bsuccess = FtpSetCurrentDirectoryA(hFTPSession,szFilePath);
	if (!bsuccess)
	{
		InternetCloseHandle(hINTSession);
		InternetCloseHandle(hFTPSession);
		cout << "更改目錄失敗!" << endl;
		return -1;
	}

	cout << "開始獲取檔案"<< endl;
	//FtpGetFile 這個函式從FTP伺服器檢索一個檔案,並將其儲存在指定的檔名下,在此過程中建立一個新的本地檔案
	BOOL bFTPRet = FtpGetFileA(hFTPSession,szFileName,szNewFileName,FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY,0);
	if (!bFTPRet)
	{
		cout << "下載檔案失敗!"<< endl;
		cout << GetLastError() << endl;
	}

	//關閉控制代碼
	InternetCloseHandle(hINTSession);
	InternetCloseHandle(hFTPSession);
	

	return 0;
}