首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

WinINet FTP API 完整參考:從連線到檔案操作的 13 個核心函數

     編輯:VC 教學

Windows FTP 程式設計:WinINet 高層 API 全景速查

WinINet (wininet.h/wininet.lib) 提供比 Winsock 更高層的 FTP/HTTP/Gopher 協定封裝,自動處理控制連線、資料連線、被動模式、認證等細節。本文整理 13 個核心 FTP API,涵蓋會話管理、目錄操作、檔案傳輸、清單列舉、重命名等全生命週期操作。

API 分類總覽表

類別函數用途
會話管理InternetOpen初始化 WinINet,取得會話句柄 (User-Agent、Proxy 設定)
InternetConnect建立 FTP/Gopher/HTTP 連線,回傳連線句柄 (主機、帳號、密碼、埠口、被動模式旗標)
目錄操作FtpCreateDirectory建立遠端目錄
FtpRemoveDirectory刪除遠端目錄 (必須為空)
FtpSetCurrentDirectory切換遠端工作目錄
目錄查詢FtpGetCurrentDirectory取得目前遠端目錄路徑
FtpFindFirstFile開始列舉,回傳搜尋句柄與第一筆 WIN32_FIND_DATA
列舉續傳InternetFindNextFile續傳列舉下一筆
檔案傳輸FtpGetFile下載檔案 (支援斷點續傳旗標、屬性保留、回呼進度)
FtpPutFile上傳檔案
FtpDeleteFile刪除遠端檔案
FtpRenameFile重命名/移動遠端檔案
FtpOpenFile開啟遠端檔案讀寫 (支援隨機存取、InternetReadFile/InternetWriteFile)
命令通道FtpCommand發送原始 FTP 指令 (如 SITE, STAT, FEAT 等擴展指令)

典型操作流程範例

// 1. 初始化會話
HINTERNET hSession = InternetOpen("MyFtpClient/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

// 2. 連線 FTP 伺服器
HINTERNET hConnect = InternetConnect(hSession, "ftp.example.com", INTERNET_DEFAULT_FTP_PORT,
                                     "username", "password", INTERNET_SERVICE_FTP, 
                                     INTERNET_FLAG_PASSIVE, 0); // 被動模式

// 3. 上傳檔案
BOOL ok = FtpPutFile(hConnect, "local.txt", "remote.txt", FTP_TRANSFER_TYPE_BINARY, 0);

// 4. 列舉目錄
WIN32_FIND_DATA findData;
HINTERNET hFind = FtpFindFirstFile(hConnect, "*", &findData, 0, 0);
if (hFind) {
    do {
        // 處理 findData.cFileName, findData.dwFileSize, findData.ftLastWriteTime...
    } while (InternetFindNextFile(hFind, &findData));
    InternetCloseHandle(hFind);
}

// 5. 清理
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);

關鍵參數與旗標詳解

  • 傳輸類型:FTP_TRANSFER_TYPE_BINARY (二進位、預設) vs FTP_TRANSFER_TYPE_ASCII (文字、自動換行轉換)
  • 被動模式:INTERNET_FLAG_PASSIVE (預設主動模式),防火牆/NAT 環境必須啟用
  • 斷點續傳:FtpGetFile 的 dwFlags 可設 FTP_TRANSFER_TYPE_UNKNOWN 配合 FILE_FLAG_WRITE_THROUGH 實現,但 WinINet 原生支援有限,大檔案建議自行分塊
  • 非同步操作:InternetSetStatusCallback 註冊回呼,支援進度、狀態、錯誤通知
  • Proxy 支援:InternetOpen 的 lpszProxy/lpszProxyBypass 參數

常見錯誤碼與排查

錯誤碼含義對策
ERROR_INTERNET_INCORRECT_HANDLE_TYPE句柄類型不匹配確認 InternetConnect 回傳句柄傳給 FTP API
ERROR_INTERNET_LOGIN_FAILURE認證失敗檢查帳號密碼、伺服器是否允許 FTP、被動模式設定
ERROR_INTERNET_EXTENDED_ERROR伺服器回傳錯誤呼叫 InternetGetLastResponseInfo 取得 FTP 回應碼 (如 530, 550)
ERROR_FILE_NOT_FOUND本地/遠端檔案不存在確認路徑大小寫、工作目錄、權限

現代化替代方案

  • WinRT:Windows.Networking.BackgroundTransfer (UWP/WinUI 3,支援後台傳輸、電源感知)
  • libcurl:跨平台、支援 FTPS/SFTP/HTTP2、極豐富選項、命令列工具 curl 同源
  • POCO/Boost.Beast:C++ 高層網路庫,型別安全、現代 C++ 風格
  • PowerShell/.NET:System.Net.WebClient/FtpWebRequest,腳本自動化首選

WinINet 適合輕量級 Win32 桌面應用快速整合 FTP 功能,但新專案建議評估更現代、跨平台、支援 TLS 1.3 的替代方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved