VC++ FTP文件上传(断点续传)
生活随笔
收集整理的這篇文章主要介紹了
VC++ FTP文件上传(断点续传)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <WinInet.h>
#pragma comment(lib, "WinInet.lib")
HINTERNET hInternet, hConnect = NULL;// 建立會話
hInternet = InternetOpen(_T("WinInet Ftp"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0/*INTERNET_FLAG_ASYNC*/);
if (hInternet == nullptr)return ;// 建立連接
hConnect = InternetConnect(hInternet, "192.168.1.8", 21/*INTERNET_INVALID_PORT_NUMBER*/, "admin", "password",INTERNET_SERVICE_FTP, INTERNET_FLAG_EXISTING_CONNECT || INTERNET_FLAG_PASSIVE, 0);
if (hConnect == nullptr)
{InternetCloseHandle(hInternet);return ;
}// 獲取遠程文件大小信息
LARGE_INTEGER liSize = { 0 };
WIN32_FIND_DATA fileData;
std::string sRemoteFilename = "/遠程文件名.xxx";
HINTERNET hRemoteFile = FtpFindFirstFile(hConnect, sRemoteFilename.c_str(), &fileData, 0, 0);
if (hRemoteFile == nullptr)
{// 服務器不存在該文件if (FtpPutFile(hConnect, "本地文件名.xxx", sRemoteFilename.c_str(), FTP_TRANSFER_TYPE_BINARY, 0)){// 文件上傳成功}else{// 文件上傳失敗}
}
else
{// 服務器存在該文件,啟用斷點續傳liSize.HighPart = fileData.nFileSizeHigh;liSize.LowPart = fileData.nFileSizeLow;InternetCloseHandle(hRemoteFile);// 獲取本地文件大小HANDLE hLocalFile = CreateFile("本地文件名.xxx", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);if (INVALID_HANDLE_VALUE != hLocalFile){// 獲取文件大小DWORD dwSize = GetFileSize(hLocalFile, NULL);BOOL bUploadOk = FALSE;if (dwSize > liSize.QuadPart){// 建立數據傳輸通道HINTERNET hRemoteFile = nullptr;std::string sCommand = format("REST %d", liSize.QuadPart);BOOL bRet = FtpCommand(hConnect, FALSE, FTP_TRANSFER_TYPE_BINARY, _T("REST 3\r\n"), 0, NULL);sCommand = format("APPE %s", sRemoteFilename.c_str());bRet = FtpCommand(hConnect, TRUE, FTP_TRANSFER_TYPE_BINARY, sCommand.c_str(), 0, &hRemoteFile);if (bRet && hRemoteFile != nullptr){// 本地文件大小比遠程大,則續傳SetFilePointer(hLocalFile, liSize.QuadPart, NULL, FILE_BEGIN);while (TRUE){char buffer[1024];DWORD dwRet = 0;if (ReadFile(hLocalFile, buffer, 1024, &dwRet, NULL)){if (dwRet == 0){// 文件發送完畢break;}DWORD dwSize = 0;if (!InternetWriteFile(hRemoteFile, buffer, dwRet, &dwSize)){// 發送失敗break;}}else{break;}}InternetCloseHandle(hRemoteFile);}else{// 遠程文件訪問失敗DWORD dwError;TCHAR tpszBuff[2 * 1024];DWORD dwBuffLen = 2 * 1024;bRet = ::InternetGetLastResponseInfo(&dwError, tpszBuff, &dwBuffLen); }}CloseHandle(hLocalFile);}else{// 本地文件打開失敗}
}InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
總結
以上是生活随笔為你收集整理的VC++ FTP文件上传(断点续传)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 认识AD RMS
- 下一篇: 电脑公司Windows7 Ghost 2