C程式碼實現從FTP上下載檔案
阿新 • • 發佈:2018-11-02
從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; }