【问题标题】:Appending to file through FtpCommand C++通过 FtpCommand C++ 附加到文件
【发布时间】:2016-08-27 04:21:29
【问题描述】:

我正在尝试将信息附加到位于 ftp 服务器上的mainfile.txt。查看文档后,似乎wininet.h 没有任何附加方法,FtpCommand() 需要通过命令来促进附加;我遇到的问题是,我认为我在命令上搞砸了,因为几乎没有关于它的文档。如果有任何经验的人可以对此有所了解或指出我正确的方向,将不胜感激。

代码:

HINTERNET hInternet;
HINTERNET hFtpSession;

hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
hFtpSession = InternetConnect(hInternet, L"host", INTERNET_DEFAULT_FTP_PORT, L"username", 
                              L"password", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);

if (FtpCommand(hFtpSession, FALSE, FTP_TRANSFER_TYPE_ASCII, 
               L"APPE C:\\Users\\Brandon\\Desktop\\test.txt mainfile.txt", 0, 0))
    MessageBox(NULL, L"Sucess", L"Window", NULL);

else {  
    PrintServerResponse();
    MessageBox(NULL, L"Failed", L"Window", NULL);
}

InternetCloseHandle(hFtpSession);
InternetCloseHandle(hInternet);

当我发送命令APPE C:\\Users\\Brandon\\Desktop\\test.txt mainfile.txt 时,我的回复是......

Response error code: 0
Response message: 

当我发送命令APPEND C:\\Users\\Brandon\\Desktop\\test.txt mainfile.txt 时,我的回复是......

Response error code: 0
Response message: 500 APPEND not understood

我相信error code: 0 指的是无效的语法,但我不确定。第二个命令有助于显示我已正确连接到服务器。

最初我的代码使用FtpPutFile(hFtpSession, L"C:\\Users\\Brandon\\Desktop\\test.txt", L"mainfile.txt", FTP_TRANSFER_TYPE_BINARY, 0) 将文件放置到服务器,但没有使用FtpCommand()

编辑: 我发送的APPE C:\\Users\\Brandon\\Desktop\\test.txt mainfile.txt 命令似乎也在“工作”;虽然它实际上并没有传输我的本地文件,但它在列为C:\Users\Brandon\Desktop\test.txt mainfile.txt 的服务器上创建了空文档。现在我绝对相信我的错误来自于使用APPE 命令。

【问题讨论】:

  • 您的APPE 命令格式错误。阅读 FTP 规范,RFC 959
  • 我对问题的回答是否仍然格式错误?我让它正确附加,但不确定是否有什么可以做得更好。
  • APPE 命令的格式现在很好,但是在调用InternetWriteFile() 之前您没有检查错误响应。此外,InternetWriteFile() 可以写入比请求更少的字节,因此它应该在一个循环中,注意写入的返回值,以了解还需要写入哪些数据以及何时停止循环。另外,传输完成后不要忘记关闭res句柄。
  • 是的,我昨晚试图在没有错误检查的情况下粗略地构建它。 APPE 命令的有效性是否会决定是否存在服务器超时?这是我的应用程序中目前唯一的严重错误。

标签: c++ ftp wininet


【解决方案1】:

所以,APPE 指定了 remote-file,与 local-file 的传输无关。一旦使用了APPE 命令,FtpCommand 会将响应写入变量,然后您需要使用InternetWriteFile 复制 local-file 的内容。我现在唯一的问题是它给我的格式,但它现在更可行了。

代码:

    HINTERNET res;
    DWORD d; //make sure all bits written
    CHAR * texttowrite = "test write";

    FtpCommand(hFtpSession, TRUE, FTP_TRANSFER_TYPE_BINARY, 
               L"APPE mainfile.txt", 0, &res); //specifices where to write to
    InternetWriteFile(res, texttowrite, 
                      strlen(texttowrite), &d); //writes text to ftp response

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2021-02-04
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多