先看看FtpPutFile函数到底是如何工作的
可以看到,该函数发送了三条命令
TYPE I(告诉服务器使用BINARY模式传送文件)
PASV(打开传输通道)
STOR(保存文件)
FtpPutFile是阻塞执行的,而且不能续传。要续传的话得通过命令的方式实现
FTP续传的流程为:
PASV(建立数据通道 )
SIZE filename(获取服务器上的文件大小,为了确定续传的位置)
REST XXX(移动文件指针到XXX)
STOR(保存文件)
FtpCommand无法知道"SIZE"命令的返回值,所以编程时改用FtpFindFirstFile函数去获取文件信息,其中包含了文件大小。
接着使用"REST"命令去移动文件指针,再通过"STOR"传输文件。
伪代码如下:
// 获取文件信息 WIN32_FIND_DATA fileData; InternetCloseHandle(FtpFindFirstFileW(hConnect, L"123.txt", &fileData, 0, 0)); // 定位到文件的第3个字节 FtpCommandW(hConnect, FALSE, FTP_TRANSFER_TYPE_UNKNOWN, L"REST 3", 0, nullptr); // 建立数据传输通道 HINTERNET hFile = nullptr; FtpCommandW(hConnect, TRUE, FTP_TRANSFER_TYPE_BINARY, L"STOR 123.txt", 0, &hFile); // 写入3个字节 char buffer[3]{ 0x34, 0x35, 0x36}; DWORD dwSize = 0; InternetWriteFile(hFile, buffer, 3, &dwSize);
注意FtpCommand的第2个参数,当它为TRUE时表示需要建立数据链接,它会在执行指定命令前先发送一个"PASV"。
最后通过InternetWriteFile向返回的链接句柄写入数据即可。
服务器收到的命令如下: