C ++ FTP WinINet,无法从FTP服务器下载文件夹

时间:2013-08-29 07:02:49

标签: c++ ftp wininet

我正在尝试下载名为“public_html”的文件夹,但它在我的程序中没有做任何事情,这是我的代码。

int main(){
    cerr<<"Hello"<<endl;
    string spath = "C:/Users/"+GetUser()+"/Desktop";
    spath += str;
    LPCSTR path = spath.c_str();
    HINTERNET hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); // Initialization for WinInet Functions
    if (!hInternet) { cerr<<"error code is "<<GetLastError()<<"\n";
      system("pause");
      return 1; }

    // Starts a session in this case an FTP session
   HINTERNET hFtpSession = InternetConnect(hInternet,IP,INTERNET_DEFAULT_FTP_PORT,User,Pass, INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);
    if(!hFtpSession) {
      InternetCloseHandle(hInternet);
      cerr<<"error code is "<<GetLastError()<<"\n";
      system("pause");
      return 2;
    }

   FtpGetFile(hFtpSession, str, path, false, NULL, FTP_TRANSFER_TYPE_BINARY, NULL);
   // Uploads the file C:\\Test.txt onto the FTP server as Test.txt

   InternetCloseHandle(hFtpSession); // Close hFtpSession
   InternetCloseHandle(hInternet); // Close hInternet
    return 0;
}

当我一次下载单个文件但是当我使用文件夹时,这不起作用。为什么不?顺便说一句

LPCSTR str = "/public_html";

1 个答案:

答案 0 :(得分:3)

在处理倾向于抽象基本原则的库或API时,这就是问题:您最终无法理解计算机上真正发生的事情,并且无法轻松确定用于何种目的的函数。

要回答这个问题,你必须退一步看看FTP本身。

您使用的功能称为FtpGetFile不是 FtpGetFolder。 FTP本身代表文件传输协议。

无论您使用的库有多棒,您都无法告诉FTP 服务器您的客户希望它为其提供一个完整的文件夹进行下载。您一次只能下载一个文件。所以解决方案是请求该文件夹中的文件列表,然后编写一个函数来遍历响应并下载每个单独的文件,根据需要递归来处理嵌套的文件夹/目录。