Internet API实现FTP断点续传

时间:2021-10-15 23:59:16

先看看FtpPutFile函数到底是如何工作的

Internet API实现FTP断点续传

可以看到,该函数发送了三条命令
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向返回的链接句柄写入数据即可。

服务器收到的命令如下:

Internet API实现FTP断点续传