这里的递归下载指的是用
recursive
方式处理目录,即把该目录下的所有文件和子目录原样下载到本地。一个目录就是一棵树,子目录就是树中的内结点,文件和空目录就是树中的叶子结点,遍历树的算法就是深度优先和广度优先,因此写程序递归下载的思路也就是深度优先或者广度优先这两种思路。
思路和代码实现都非常简单。这里最主要的地方在于 FTP 协议规定在一次 session 中只能遍历一个目录,这是从晚上十点写代码到深夜两点多的“收获”。见 MSDN 中的说明:
FtpFindFirstFile is similar to the Win32 FindFirstFile function. Note, however, that only one FtpFindFirstFile can occur at a time within a given FTP session. The enumerations, therefore, are correlated with the FTP session handle. This is because the FTP protocol allows only a single directory enumeration per session.
以上来自于 Platform SDK 文档, MFC 中的关于 WinInet 的文档中没有说这些。
别的就没有了,把使用 WinInet 实现的代码贴到下面, php 里面不用管这些 FTP 协议的细节,因此使用 PHP 来实现递归下载非常简单, PHP 的实现代码贴在 C++ 代码后面。
#include <iostream >
#include <queue>
using namespace std;
typedef struct _Q {
CString strRemoteDir , strLocalDir ;
_Q( ) {
strRemoteDir = "" ;
strLocalDir = "" ;
}
_Q( LPCTSTR r, LPCTSTR l) {
strRemoteDir = r;
思路和代码实现都非常简单。这里最主要的地方在于 FTP 协议规定在一次 session 中只能遍历一个目录,这是从晚上十点写代码到深夜两点多的“收获”。见 MSDN 中的说明:
FtpFindFirstFile is similar to the Win32 FindFirstFile function. Note, however, that only one FtpFindFirstFile can occur at a time within a given FTP session. The enumerations, therefore, are correlated with the FTP session handle. This is because the FTP protocol allows only a single directory enumeration per session.
以上来自于 Platform SDK 文档, MFC 中的关于 WinInet 的文档中没有说这些。
别的就没有了,把使用 WinInet 实现的代码贴到下面, php 里面不用管这些 FTP 协议的细节,因此使用 PHP 来实现递归下载非常简单, PHP 的实现代码贴在 C++ 代码后面。
#include <iostream >
#include <queue>
using namespace std;
typedef struct _Q {
CString strRemoteDir , strLocalDir ;
_Q( ) {
strRemoteDir = "" ;
strLocalDir = "" ;
}
_Q( LPCTSTR r, LPCTSTR l) {
strRemoteDir = r;